From 9bc5425910281c80ca0af9e961f8a6a8a6ee5515 Mon Sep 17 00:00:00 2001 From: Herlock Sholmes Date: Fri, 28 Aug 2020 17:43:46 -0400 Subject: [PATCH] 0019: se modifica IntroaGNUGuix.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Incluyendo la presentación completa con ejemplos y texto --- Presentaciones/IntroaGNUGuix.org | 315 ++++++++++++++++++++++++++++++- 1 file changed, 312 insertions(+), 3 deletions(-) diff --git a/Presentaciones/IntroaGNUGuix.org b/Presentaciones/IntroaGNUGuix.org index f59033e..a7918fe 100644 --- a/Presentaciones/IntroaGNUGuix.org +++ b/Presentaciones/IntroaGNUGuix.org @@ -12,8 +12,6 @@ esta distribución (y gestor de paquetes) avanzada del sistema GNU. - Historia :: Orígenes y motivaciones del proyecto GNU Guix. - Funcionamiento :: Detalles de lo que convierte a Guix en un gestor de paquetes avanzado. -- Configuración :: Utilizar las herramientas vistas para tener una distro ajustadas a - tus necesidades. - Mantención :: Peculiaridades a las que dedicar atención para el correcto funcionamiento del SO. - Palabras de cierre :: Compromiso y alineamiento con la filosofía de GNU guix. @@ -87,16 +85,327 @@ for GNU?" se establecen 2 motivaciones: sea 100% software libre, práctica, y que esté fuertemente integrada con el sistema GNU. +*** Propósitos de la distribución Eventualmente, se presentarían 2 nuevos objetivos centrales: + Que las usuarias de la distribución puedan tener una Libertad 1 facilitada por Guile. + Tener ambientes de desarrollo reproducibles (desde la declaración de la configuración, hasta el bootstrap de inicio). +*** ¿Cómo lograría esto? +Un sistema completamente declarativo, utilizando Guile scheme. + +#+BEGIN_SRC scheme +(define-public hello + (package + (name "hello") + (version "2.10") + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/hello/hello-" version + ".tar.gz")) + (sha256 + (base32 + "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) + (build-system gnu-build-system) + (synopsis "Hello, GNU world: An example GNU package") + (description + "GNU Hello prints the message \"Hello, world!\" and then exits. It +serves as an example of standard GNU coding practices. As such, it supports +command-line arguments, multiple languages, and so on.") + (home-page "https://www.gnu.org/software/hello/") + (license gpl3+))) +#+END_SRC + * Funcionamiento ** Configuración declarativa +*** Todo en un archivo +Uno de los puntos fuertes de Nix y Guix es que se puede tener la /declaración/ del +Sistema Operativo completo en sólo un archivo que incluya los servicios, los paquetes, y las configuraciones de éstos a utilizar por la usuaria. + +*** Veamos un ejemplo propio +#+BEGIN_SRC scheme +(use-modules (gnu)) +(use-service-modules desktop networking ssh xorg) +(use-package-modules wm) + +(define %paquetes-base-de-todo-el-sistema + (map specification->package + '("los" + "paquetes"))) + +(operating-system + (locale "en_US.utf8") + (timezone "America/Santiago") + (keyboard-layout (keyboard-layout "latam")) + (host-name "LibreBadger") + (users "declaración de usuario" + %base-user-accounts)) + (packages %paquetes-base-de-todo-el-sistema) + + (services + (append + (list (service gnome-desktop-service-type) + (service openssh-service-type) + (set-xorg-configuration + (xorg-configuration + (keyboard-layout keyboard-layout)))) + %desktop-services)) + + (bootloader + (bootloader-configuration + (bootloader grub-efi-bootloader) + (target "/boot/efi") + (keyboard-layout keyboard-layout))) + + (swap-devices (list "/dev/sda2")) + + (file-systems + (cons* (file-system + (mount-point "/boot/efi") + (device (uuid "12-chachacha" 'fat32)) + (type "vfat")) + (file-system + (mount-point "/") + (device + (uuid "34-ChaChaCha" + 'ext4)) + (type "ext4")) + %base-file-systems)) +#+END_SRC +*** Desmenucemos esa configuración +Este archivo de configuración declara 4 partes importantes: +- Las usuarias +- Los paquetes +- El conjunto de servicios +- Cargador de arranque + +*** Declaración de usuarias +Dentro de la definición de sistema operativo, podremos encontrar una declaración +de la función *users*, en la que debemos incluir toda la información de las usuarias +que deseemos agregar, como en el siguiente ejemplo: + +*** Declaración de usuarias +#+BEGIN_SRC scheme +(users (cons (user-account + (name "4lib") + (comment "gupo en que no todos quieren reconocerser fan de Emacs") + (group "users") + (supplementary-groups '("todos" "los" "grupos" "necesarios"))) + %base-user-accounts)) +#+END_SRC + +*** Declaración de paquetes base +La función *packages* invocará a /guix package install/ con permisos de root, y todos +los paquetes que se declaren como argumentos de esta función quedarán instalados y +disponibles para todas las usuarias. + +*** Declaración de paquetes base +#+BEGIN_SRC scheme +(packages + (append + (specification->package "stumpwm-with-slynk") + %base-packages)) +#+END_SRC + +*** Declaración de paquetes base +Pero, para que nuestra configuración quede más legible podemos hacer uso de las siguientes funciones de guile: + +#+BEGIN_SRC scheme +(define %paquetes-utilidades + (map specification->package + '("nss-certs" + "git"))) +(define %paquetes-wm + (map specification->package + '("stumpwm-with-slynk" + "sbcl"))) +;; En la declaración de SO + (packages + (append + %paquetes-utilidades + %paquetes-wm + %base-packages)) +#+END_SRC + +*** Declaración de los servicios +Si quisieramos tener ssh, xorg, o un gestor de seciones configurados, debemos incluir +esas definiciones en la declaración del SO. + +#+BEGIN_SRC scheme + (services + (append + (list (service gnome-desktop-service-type) + (service openssh-service-type) + (set-xorg-configuration + (xorg-configuration + (keyboard-layout keyboard-layout)))) + %desktop-services)) +#+END_SRC + +*** Declaración de servicios +Pero también hay otros servicios, como uno para utilizar software de bloqueo de pantallas (como i3lock). O de BBDD, impresión, gestión de contraseñas con PAM, etc. + +*** Declaración del cargador de arranque +Finalmente, también se puede gestionar el cargador de arranque desde la declaración +del SO: + +#+BEGIN_SRC scheme + (bootloader + (bootloader-configuration + (bootloader grub-efi-bootloader) + (target "/boot/efi") + (keyboard-layout keyboard-layout))) +#+END_SRC + +*** Actualización del sistema +Una vez se tiene la declaración deseada, se debe hacer /guix pull/ seguido de un +=sudo guix system reconfigure /ruta/archivo/config.scm= + +** Definición de paquetes +Cuando queremos controlar más finamente el paquete a nuestro antojo, podemos ir a ver su +definición, en este caso trabajaremos con GNU-hello: + +*** Definición de GNU-hello +Un paquete en guix estará definido también en guile scheme, donde se utilizan las funciones *name*, *version*, *source*, *build-system*, *synopsis*, *description*, *homepage*, y *license*: + +#+BEGIN_SRC scheme +(define-public hello + (package + (name "hello") + (version "2.10") + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/hello/hello-" version + ".tar.gz")) + (sha256 + (base32 + "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) + (build-system gnu-build-system) + (synopsis "Hello, GNU world: An example GNU package") + (description + "GNU Hello prints the message \"Hello, world!\" and then exits. It +serves as an example of standard GNU coding practices. As such, it supports +command-line arguments, multiple languages, and so on.") + (home-page "https://www.gnu.org/software/hello/") + (license gpl3+))) +#+END_SRC -* Configuración +** Gestión de paquetes +Los paquetes no sólo pueden ser gestionados mediante la reconfiguración del sistema, sino también por cada usuaria del equipo sin necesidad de privilegios especiales. + +Esta gestión se puede hacer mediante las herramientas ++ Guix package ++ Guix pull ++ Guix describe ++ Guix gc + +*** Guix package +Guix package es la opción responsable de la instalación, actualización, remoción, y búsqueda de los paquetes. + +#+BEGIN_SRC shell +guix package -i paquete +guix install paquete +#+END_SRC + +*** Guix package +#+BEGIN_SRC shell +guix package -r paquete2 +guix remove paquete2 +#+END_SRC + +*** Guix package +#+BEGIN_SRC shell +guix package -r paquete2 -i paquete +#+END_SRC + +*** Guix package +#+BEGIN_SRC shell +guix package -u paquete3 +guix upgrade paquete3 +#+END_SRC + +*** Guix package +#+BEGIN_SRC shell +guix package -s expresion-regular +guix search expresion-regular +#+END_SRC + +*** Guix package +Además, todos los cambios que se hagan mediante guix package quedarán registrados como +/generaciones/, por lo que la usuaria siempre puede volver a un estado anterior invocando =guix package --roll-back= o =guix package -S patrón-de-generaciones= + +*** Guix pull +Guix obtiene sus paquetes desde un repositorio en git, por lo que para sincronizar los +cambios y nuevos paquetes de los commit, se debe hacer /guix pull/. + +*** Guix pull +El que esté en git significará que puedo tener una máquina apuntando a un determinado commit de la línea de tiempo del desarrollo de Guix, esta capacidad se llama =guix time-machine=. + +*** Guix describe +Cuando no recuerdes la versión de guix que estás corriendo, o los canales que estás +usando, puedes invocar =guix describe= para obtener esa información. + +*** Guix gc +Un potencial problema de guix es que la tienda ocupa más espacio (ya que los elementos que están en la tienda no se borran hasta que se solicita explícitamente). + +*** Guix gc +Este resguardo de las generaciones ayuda a que guix sea prácticamente muy estable (si algo deja de funcionar en una actualización, puedo volver a un estado anterior). La única forma de reclamar ese espacio es invocando =guix gc= + +#+BEGIN_SRC shell +guix package --delete-generations=patrón +guix gc --collect-garbage + +guix gc -d patrón +#+END_SRC + +*** Guix channels +Se pueden utilizar repositorios de git que no sean el de GNU para la actualización del +sistema. Así como también repositorios git que tengan definidos paquetes para guix. + +*** Guix channels +A esta función se le denomina /canales/, y le da flexibilidad y personalización a GNU +guix. Para utilizarla basta con editar el archivo =./config/guix/channels.scm= y luego correr =guix pull=. + +*** Guix channels +#+BEGIN_SRC scheme +;; Cambiar el repo para todos los paquetes. +(list (channel + (name 'guix) + (url "https://example.org/my-guix.git") + (branch "super-hacks"))) +;; Añadir un repo que define nuevos paquetes. +(cons (channel + (name 'my-personal-packages) + (url "https://example.org/personal-packages.git")) + %default-channels) +#+END_SRC + +** Desarrollo +*** Guix environment +Para generar ambientes de desarrollo, guix incluye una herramienta llamada /environments/ que incluyen el conjunto de paquetes que la usuaria necesite para trabajar (siendo similar a los contenedores de docker). + +=guix environment paquete= * Mantención +Ya conocemos las herramientas, propongamos entonces una forma de mantener nuestro sistema +al día. + +** Archivo de configuración +Es recomendable mantenerlo en control de versiones, para así poder recuperarlo en caso +de cambiar nuestro equipo, pero además: + ++ Hacer =guix pull= con una regularidad semanal ++ hacer =sudo guix sistem reconfigure= al menos una vez cada semana (dependiendo de la versión del kernel que estén ratreando). + +** Guix packages +Utilizarlo sólo cuando se quiera tener un paquete que no necesite permisos especiales, o +que no estemos seguros de su necesidad a largo plazo. + ++ =guix search= y =guix upgrade= serán las herramientas con mayor utilización ++ =guix install= y =guix remove= verán un uso moderado para quienes acostumbren otra distribuciónGNU/Linux. * Palabras de cierre +** Agradecimientos +A todo el equipo de hackers de GNU, y obviamente a Ludovic Cortés y Ricardo Wurmus, sin quienes esta maravillosa distro no existe. + +A 4libertades Chile, por ser tan ñoños como para interesarse en este tema. -- 2.30.2