Unai, lo primero que he pensado al ver tu email ha sido: "esto me pasa por
preguntar" jaja Pero ahora fuera bromas, mila esker por tu detallada respuesta.
Pero has abierto un melón enorme que es muy difícil de partir.
Creo que tienes una experiencia enorme en el empaquetado y distribución de
aplicaciones. Yo vengo más de la parte de sistemas de la virtualización con
experiencia principalmente en ESXi y KVM. Y desde hace unos años me pego con
los contenedores, desde hace años con docker tanto en casa "selfhosted" como en
el trabajo y últimamente con Kubernetes. A esto le sumo la gestión de la
configuración con ansible, docker-compose, dotfiles... Y un poco de
empaquetado/distribución de python pero en pequeños proyectillos con
venvwrapper, pyenv y poetry. No he hecho mucho, pero a poco que tocas en Linux,
al final te metes en varios charcos...
En tu correo haz mezclado cosas de servidor como Proxmox como de Escritorio. Mi
email va más por la parte de "Linux en el Escritorio". Igual este es el año de
"Linux en el Escritorio" xDDD
Te comento un par de cosas sobre QubesOS que he ido probando:
* QubesOS apuesta por máquinas virtuales. Primero porque las máquinas
virtuales presentan un mayor aislamiento y seguridad que los contenedores cuyo
fin principal nunca ha sido la seguridad.
* El uso de Xen frente a KVM creo que es porque Xen al ser
para-virtualización se supone que obtiene un mejor rendimiento y por otro lado
porque con Xen es posible usar aplicaciones virtuales en el dom0/hipervisor
como si fuesen aplicaciones nativas. No a traves de la consola de la máquina
virtual.
* Además QubeOS ha pensado muy bien como gestionar todo este pool de MV:
* Hay MV especiales para networking, firewall, USB... Y algunas de estas
son disposable (lo comento más abajo).
* Define MV plantilla, que instancias varias veces. Por ejemplo MV
plantilla de desarrollos software que instancio una por cada proyecto que tengo.
* Cuando actualizo las plantillas (yum update), se me actualizan todas
las instancias!
* La actualización de las plantillas, se hace desde el gestor de
máquinas virtuales. Le das a actualizar todas las plantillas y se pone a ello.
* Tienen una herramienta de backup, para poder hacer backup de los datos
y las MV.
* Tienen el concepto de MV disposable, que es como un livecd, que pierde
el estado cuando la apagas y se arranca como recien instalada. Por ejemplo, si
recibes un fichero sospechoso, lo abres en una MV disposable y tras reiniciar
la MV, esta como recien instalada.
* Integran WhonixOS en 2 máquinas virtuales para la navegación Tor
segura. Y usa máquinas disposables por si te hackean durante la navegación.
* Pero tiene handicaps:
* Necesitas un equipo hardware potente y con un hardware muy determinado.
* El entorno gráfico es XFCE te guste o no.
* Es muy interesante ver como proponen usar QubesOS por diferentes perfiles
de usuarios: hacktivista, desarrollador de software, financiero...
https://www.qubes-os.org/doc/how-to-organize-your-qubes/
En general QubesOS me gusta por la seguridad y por la limpieza a la que te
obliga. No mezclaras tu vida personal con tu trabajo porque van en Qubes
(máquinas virtuales) diferentes. Y no tienes otra, porque el
anfitrion/hypervisor no lo puedes tocar apenas.
En este aspecto, los sistemas operativos inmutables, te fuerzan a algo similar.
Es dificil instalar, o no óptimo, instalar software en el sistema operativo
base. Tienes que usar aplicaciones de flatpak, snap, appimage o nix. O
directamente contenedores con podman/distrobox/toolbox.
He estado probando Fedora Kinoite y la filosofía sería la siguiente, si
necesito instalar una aplicación:
1. Preferentemente flatpak/snap/appimage si es GUI
2. Si es CLI tienes que is a toolbox/distrobox o directamente crear una
imagen/contenedor.
3. El último supuesto es instalar algo en el sistema base
Con toolbox/distrobox se pueden arrancar aplicaciones gráficas desde
contenedores. La verdad que creia que no era posible arrancar GUIs desde
contenedores. Y creo que es posible hacerlo incluso con docker/podman con
cierta configuración.
Como soy usuario KDE, Fedora Kinoite me está convenciendo. Pero todavía no
tengo claro como trabajaría:
* flatpak no me entusiasma, creo que todavía no esta madura y muchas
aplicaciones reciben demasiados permisos.
* la actualización se complica:
* actualizas el sistema base con rpm-ostree
* actualizas los flatpaks
* tienes que actualizar con "yum update" los toolbox que tengas y con el
correspondiente comando los distrobox o podmans
* el backup... no es como QubesOS que te ofrece una herramienta... también
te lo haces (yo hasta ahora usaba borg y btrfs)
Y a este mar de dudas, he descubierto nix (el gestor de paquetes no NixOS) y la
verdad que lo que veo me gusta.
* Para generarme un entorno CLI de trabajo independientemente del Linux o
MAC en el que me encuentre.
* Para distribuir mis proyectillos de software con un entorno de ejecución
que no sea docker
* Para incluso gestionar mis dotfiles con "nix home-manager".
No se estoy por seguir testando Fedora Kionite y descubriendo Nix.
Saludos!
--
Christian Pinedo <[email protected]> [+34 94 601 2156]
Sistemas/Sistemak, Vicegerencia TIC/IKZ Gerenteordetza, UPV/EHU
PGP fingerprint: A895 7C11 84F6 30B4 4938 32A4 9306 DFD0 CDE4 B542
________________________________
De: ITSAS <[email protected]> en nombre de Unai Martinez
<[email protected]>
Enviado: viernes, 21 de abril de 2023 18:24
Para: Grupo Itsas para la promocion del software libre en la UPV/EHU
<[email protected]>
Asunto: Re: [Itsas] distros inmutables y otras por ahi
Ahora si, entremos :D
Llevo varios años dándole vueltas a ese tipo de distribuciones, y planteándome
usarlas como plataforma principal, pero por razones puramente pragmáticas,
siendo muy ignorante en cuanto a seguridad.
El tema toca el empaquetado y distribución de software, y también los
contenedores, porque aunque hablamos de distribuciones, nix, flatpak, etc.
Tengo varias cuantas cosas acumuladas en la cabeza en este sentido. De hecho,
estoy en proceso de escribir un artículo|paper más bien divulgativo al respecto
(el uso de contenedores en escritorio y para desarrollo, muy al margen de todo
el ruido de la nube).
Espero me permitas responder con un artículo de blog, más que un correo.
Puede que quieras leer las secciones en orden inverso (y en cualquier caso en
diagonal), ya que al final hablo de hipervisores, anstes de distribuciones
inmutables, antes de nix, y las secciones anteriores (las primeras) son para
explicar cómo llego yo a esas conclusiones (más bien cómo mis premisas me
condicionan).
TL;DR:
- nix guay; nixOS no sé yo.
- CoreOS o SilverBlue worth a try como alternativa a Ubuntu Server o Fedora
Server. Para Workstation, casi que lo mismo da.
- Totalmente de acuerdo en que empezar a entender cómo y a aislar las
aplicaciones, los datos, el sistema, la capa de usuario, etc. siempre bien, por
razones de seguridad pero también pragmáticas (la estabilidad de nuestra
infraestructura "personal" a lo largo de los años) cada cual con las
herramientas que menos disrupción le supongan.
- QubesOS MUY interesante.
# Contexto
Utilizo 4-6 equipos diferentes en mi día a día, con Windows 10, Fedora, Red
Hat, Debian o Ubuntu. La primera vez, es divertido y didático cacharrear con
las particularidades de cada sistema, con la configuración de las herramientas
y el escritorio, etc. Con el tiempo, la diversión pasa a ser trabajo, y a
generar cierta ansiedad el no poder trabajar en otras cosas más excitantes sino
tener que pelear con X característica/configuración otra vez más.
Por eso, he acabo reduciendo el host a:
- Vim, git y openSSH y Docker|Podman.
- Si tiene escritorio:
- Firefox (con "sincronización" de pestañas; a ver cuándo se pueden
sincronizar contenedores tambíén).
- VSCode|VSCodium y LibreOffice.
- Gimp, Inkscape, Meld (en GNU/Linux) o WinMerge (en Windos).
- Steam y Godot (que es estático).
Todo lo demás lo uso a través de contenedores: GCC, LLVM, Go, NodeJS, LaTeX,
Sphinx, asciidoctor, pandoc, Matlab, Octave, Vivado, ModelSim/QuestaSim, EDA
open source (simulación, síntesis y/o implementación), Jellyfin, qbittorrent,...
También en los sistemas ARM que soportan docker|podman. Curiosamente, en
Raspbian de 32 bits se pueden|podían ejecutar contenedores de 64 bits porque si
CPU lo soporta (Pi 3), aunque el sistema (host) sea de 32 bits¿?.
Así, no me importa en qué ordenador estoy, y tampoco me importa si el
escritorio que estoy usando está en una CPU "pobre". Los contenedores son los
mismos independientemente del sistema, y lo mismo me da ejecutarlos de forma
local o, si tengo conexión, remota (por SSH o utilizando integración continua).
Si tengo que usar el ordenador de otra persona, sé que con borrar la carpeta
local y los contenedores que haya usado no estoy dejando basura.
Si el sistema en el que estoy casca por una actualización puñetera, a malas
puedo arrancar una LiveCD de Ubuntu o Fedora y salvar el día para pelear con el
host en otra ocasión.
En clases de máster uso Gitpod, a falta de ganas para gestionar la instalación
de software en los equipos de aula de la uni que són exclusivamente Windows.
Quienes asisten con su portátil pueden instalar las herramientas de forma
nativa, sea en GNU/Linux o en Windows, si quieren.
A lo que voy: lo que me interesa es la inmutabilidad de la capa de aplicación,
que es con la que más interactúo como usuario doméstico, profesor e
investigador que desarrolla hardware/software. El sombrero de administrador de
sistemas prefiero ponermelo lo justo y necesario porque es otro pozo sin fondo
y tengo tendencia a asomarme con demasiado ímpetu. Del sistema sólo me
interesan el kernel, y los drivers para el hardware que esté conectado; y por
salud sólo quiero que me interese que funcionen.
# Contenedores, snap, flatpak, appimage, Conda...
La razón principal por la que decidí migrar todas las aplicaciones a
contenedores es que en 2016-2017 Windows Subsystem for Linux (WSL) no existía
de forma usable pero Docker for Windows sí funcionaba sobre HyperV. Combiné (y
combino) MSYS2 con Docker en Windows para utilizar los mismos scripts y
Makefiles que desarrollo en GNU/Linux.
En comparación con snap/flatpak/appimage, los contenedores GNU/Linux
funcionaban y funcionan "exactamente" igual en cualquier sistema GNU/Linux,
Windows o macOS. La experiencia que tengo con snap/flatpak/appimage es que
funcionan en GNU/Linux, pero no siempre, y no lo hacen en Windows. WSL2 no es
Windows, sino una VM/contenedor, por lo que lo considero equivalente a usar
Docker for Windws.
Y aislan, pero no del todo. Porque si dependen de, por ejemplo, Python, pueden
usar el python del sistema, que puede no ser el mismo dependiendo del host.
Tampoco parece conceptualmente razonable meter una instalación de python en
cada snap/flatpak/appimage, porque no comparten contenido entre si.
Si combinamos snap/flatpak/appimage con venvs de Python, nos acercamos a
reinventar Conda (ver más abajo).
Son soluciones pensadas para aislar excepcionalmente algunas librerias del
sistema, pero no todo el sistema de ficheros.
Por contra, los contenedores son soluciones paara aislar todo el sistema de
ficheros, con honrosas excepciones.
Por eso, no he tenido interés particular por entender cómo funcionan y por qué
no lo hacen a veces. Si en cualquier caso voy a tener que meter las
herramientas en un contenedor para usarlas en Windows o macOS, me sobra la capa
de abstracción que me ofrecen. No considero que nix esté exactamente en la
misma categoría, lo cual es mi motivación para responder a este hilo :D. Ver
más abajo.
Conda (Anaconda, Miniconda, Mamba...)... menudo pastel, eh! La idea no es mala:
tener un conjunto de librerías para cada una de las plataformas y compilar las
herramientas contra esas librerías. De forma similar a snap/flatpak/appimage,
el sistema de ficheros no está del todo aislado. Básicamente se manipulan las
PATH y LD_LIBRARY_PATH, construyéndose sobre los venv de Python, pero por lo
demás es una aplicación nativa normal y corriente.
Conda tiene mucha tracción en el mundo académico, y en general en áreas donde
la gente trabaja con software pero no son usuarios avanzados de sistemas. Es
decir, no conocen multiples gestores de paquetes, y si lo hacen no quieren
dedicar tiempo a utilizarlos. Conda ofrece una solución que a ojos del usuario
funciona igual, por lo que no tienes que complicarte la vida si el portatil de
tu compañero de laboratorio es un macbook o usa ArchLinux mientras que en el
labo todo es Windows. Lo hace a costa de transferir la complejidad a los
empaquetadores.
De facto, Conda es una distribución que es a su vez tres distribuciones en una.
Es decir, para empaquetar una herramienta nueva en conda, hay que triplicar el
esfuerzo en comparación con lo que supondría empaquetarla sólo para deb, rpm o
msys2.
Por lo tanto, si el objetivo es empaquetarla de forma "nativa" para dos o tres
plataformas, puede merecer la pena invertir el esfuerzo en aprender Conda en
vez afrontar las particularidades de cada entorno y comunidad.
Pero, por otra parte, podemos compilar las herramientas una sola vez para por
ejemplo Debian y meterlas en un contenedor para poder usarlas en "cualquier"
plataforma. La comunidad de empaquetadores de Debian (o la de Fedora, o
ArchLinux) es mucho más madura y numerosa que la de Conda.
Anaconda se lanzó (2012) apenas un año antes de que Docker surgiera (2013).
Tuvieron muy mal timing. Si no hubieran surgido los contenedores, posiblemente
el ecosistema de Conda habría recibido mucha más financiación y cariño. Pero
todos los grandes se pusieron muy en serio con los contenedores, y en apenas
3-4 años se comieron los mercados que mueven dinero, y de ahí en cascada. El
comunicado de Docker hace un par de años (después de vender la división cloud)
de "vamos a volver a centrarnos en los desarrolladores". No exactamente ellos,
pero Microsoft, RedHat, etc. ya han fijado rumbo y estos no paran.
Si los recursos que se destinan al desarrollo de snap, flatpak, appimage y
Conda se unificaran, podría sugir algo que compitiera con los contenedores por
ser más fácil de usar (al no tener que entender que el sistema de ficheros esté
aislado por defecto). Pero no suele ser esa la dinámica del bazar.
Hace un par de años, tuve el placer de conversar con Ray Donnelly
(https://github.com/mingwandroid), un desarrollador de Conda que también era
co-fundador y empaquetador en MSYS2. MSYS2 es un sistema para disponer de una
shell bash y el gestor de paquetes pacman en sistemas Windows, pero generando
binarios nativos de windows. Naturalmente, se nutre mucho de las recipes de
ArchLinux, tanto que se comparan las versiones para no quedarse atrás:
https://packages.msys2.org/outofdate.
Desde 2013 hasta 2020 no creció mucho, pero a partir de 2020 está creciendo
bastante. Ya tiene varios miles de paquetes disponibles.
La idea de Ray era hacer que todos esos paquetes estuvieran disponibles a
través de Conda: https://anaconda.org/msys2/repo.
Por desgracia, el trabajo de Ray se vió ralentizado por el cáncer, y falleció
en 2021.
Es una historia que me resulta muy dolorosa por empatía, pero también muy
didáctica.
Creo que Conda podría crecer si se pudieran reutilizar las recetas de MSYS2
para Windows y las de ArchLinux para Linux; pero objetivamente puede que no sea
razonable el esfuero necesario ya que quienes empaquetan en Conda lo hacen
precisamente para evitar tener que gestionar el empaquetado en otras
plataformas más asentadas.
# Empaquetado y distribución de herramientas open source para EDA
Desde principios de 2022, por las mañanas soy investigador en la UPV/EHU y por
las tardes trabajo de forma remota para Antmicro, una empresa polaca con Google
como uno de los clientes principales. Desde 2019-2020 estoy implicado en varios
proyectos donde participan gente de Antmicro y Google, impulsados por el foco
que ha puesto Google (bueno, cierta gente dentro) para eventualmente dejar de
depender de software no libre (ejem no gratis) para fabricar sus chips.
Los conocimientos y opiniones (naturalmente my own) que estoy exponiendo
proceden principalmente de mi implicación en https://github.com/hdl/, de la que
soy co-creador, "owner" (admin) y mantenedor/desarrollador de varios
repositorios. Los reseñables en este hilo son:
- https://github.com/hdl/packages
- https://github.com/hdl/conda-eda
- https://github.com/hdl/bazel_rules_hdl
- https://github.com/hdl/containers
El "problema" que estamos tratando de resolver es la distribución de
herramientas FLOSS para EDA (tanto simulación, como síntesis e implementación
sea para FPGAs o para ASICs). Para algunos usuarios, las FPGA son el objetivo
final, sobre todo porque tradicionalmente la fabricación de chips era
prohibitivamente cara. Sin embargo, dentro de la estrategia de Google de
"democratizarlo", llevamos varios años con 2-3 tiradas anuales en las que se
fabrican chips gratis siempre que el diseño sea open source:
https://opensource.googleblog.com/2022/10/announcing-globalfoundries-open-mpw-shuttle-program.html.
Por lo tanto, el interés de Google ya ha pivotado hacia los ASICs como
objetivo.
No somos tontos; resulta evidente que a Google le sale más rentable financiar
gente suelta por el mundo siempre que lo que hagan sea Apache (no GPL), y les
interesa fabricar diseños arbitrarios en tecnologías "baratas" (para sus
escalas) para poner a prueba las herramientas.
Como resultado, hoy en día cualquiera de nosotros puede diseñar por ejemplo un
RISC-V utilizando sólo herramientas libres, subirlo a un repositorio y en 6-12
meses tener de vuelta 100-500 chips físicos gratis. En los siguientes enlaces
podéis ver los diseños:
- https://efabless.com/open_shuttle_program
- https://platform.efabless.com/projects/shuttle/11
Si tenéis un mes de tardes libres (ja), o algún estudiante inquieto/a que
quiera hacer un TFG diferente, es gratis y el viaje merece la pena. Hay diseños
complejos, pero también hay pruebas tan sencillas como generar un patrón por
una salida VGA (que son dos contadores anidados y un puñado de comparadores).
No merece la pena complicarse, lo bonito es el camino.
Volviendo al empaquetado y distribución, "las herramientas open source para
EDA" son 40, 60, 100, 150? Cada día crece la lista. No son todas nuevas. La
mayoría han estado debajo de una piedra 10, 15, 20 años, desarrolladas en
silencio y soledad por un tío de Lyon, Kentucky o Dresden. Las recetas eran
inexistentes. Cada uno usaba un Makefile o CMake, o lo que más le gustaba y que
funcionara en su ordenador. Llega Google con su inyección en 2016-2019, y
veinte años de desarrollo de software nos explotan en la cara.
De repente la gente empieza a utilizar todas esas herramientas, a reportar
bugs, pedir características,... Ver por ejemplo
https://github.com/ghdl/ghdl/graphs/contributors. Ese es sólo uno de las
decenas de proyectos, y ese en particular no ha sido financiado y no está en el
radar por ser GPL. Aún así, el efecto de "cualquiera puede fabricar un chip con
herramientas libres" ha tenido un eco muy notable. Naturalmente, hay otros
muchos factores geopolíticos y económicos, como las CHIPS Act en las que andan
EU y EEUU, pero espero se entienda la simplificación. Pero, en esencia,
llevábamos desde finales de los 90 esperando a que la revolución de Linux
llegara a nuestro campo.
Así, la comunidad se enfrentó (y se está enfrentando todavía) a la necesidad de
usar docenas de herramientas que tienen que funcionar de forma coordinada pero
se desarrollan independientemente de forma muy old school, y cada una de ellas
recibe varios commits diarios. Eso es muchísima basura. Es basura para los
desarrolladores, pero también para los usuarios. Si reportan un bug y en 24-48
horas está solucionado, quieren poder usarlo ya. Aunque les evitemos el
esfuerzo de compilar usando CI, tienen que estar instalando y desinstalando
versiones. Conste que es algo invaluable, porque estamos acostumbrados a una
quasi-monopolica industria que cobra miles en licencias e ignora bugs durante
años.
Las distribuciones tradicionales no encajan. Idealmente, todas esas
herramientas estarían empaquetadas de forma canónica en Debian y en Fedora.
Poco a poco, eso se está consiguiendo. Pero tarda años. Aun en el supuesto en
el que los empaquetadores tienen comunicación con los desarrolladores y
cualquiera que quiera hacer un deb o rpm lo haga upstream (que es una quimera),
los procesos de actualización son semestrales o anuales porque la estabilidad y
los tests son importantes en esas distribuciones, y dichos tests suelen incluir
múltiples arquitecturas (amd64, arm, aarch64, s390x, ppc64, riscv...). Arch
tiene un ciclo mucho más corto (immediato), pero se aplica a todo el sistema,
no sólo a las herramientas de la última capa de usuario. Más allá, suficiente
esfuerzo nos sigue constando que los compañeros usen Ubuntu (no Linux). No creo
que Arch pueda ayudar en esos casos.
El primero de los repositorios que he enlazado
(https://github.com/hdl/packages) es un listado de las estrategias por las que
ha optado la comunidad. Desde paquetes para distribuciones tradicionales
(pkgbuild, ebuild, deb, rpm) hasta WebAssembly, desde compilaciones estáticas
hasta bazel. Curiosamente, nadie ha decidido hacer "una distribución".
https://fedoraproject.org/wiki/Electronic_Lab dejó de actualizarse hace una
década. ¿Han cambiado los tiempos? Sí hay iniciativas como
https://copr.fedorainfracloud.org/coprs/rezso/HDL/ o el Electronics Team de
Debian (https://salsa.debian.org/electronics-team).
De todas esas estrategias, la única cercana a estar "completa" (en cuanto a
número de herramientas) es la de Conda. Principalmente porque, que yo sepa, es
la única que ha recibido financiación durante varios años para que hubiera
varias personas dedicándose a ello. El resto de iniciativas son voluntarias y
generalmente con menos gente dedicada. La motivación para crear
github.com/hdl<http://github.com/hdl> en 2019 fue que esas personas al menos se
comunicaran, ya que están enfrentándose a los mismos problemas cada cual en su
entorno.
Se unieron en la organización los contenedores que yo había estado manteniendo
en otro sitio, los repositorios de conda que estaban en litex, se creó el repo
de Bazel, etc.
Fue entonces cuando valoré dejar de mantener/usar los contenedores en favor de
Conda. Pero, por las razones expuestas, me pareció y me parece pan para hoy y
hambre para mañana. Está muy bien que las corporaciones|empresas y los tiempos
modernos tengan aspiraciones que exceden la realidad, pero hacer las cosas de
forma medianamente sostenible require esfuero y tiempo.
# Contenedores, deb, y nix
La estrategia que decidí mantener es https://github.com/hdl/containers. Son una
serie de contenedores que incluyen una o varias herramientas EDA para simular,
sintetizar, programar|ejecutar, etc. Habrá unas cincuenta en total, de las que
unas 30 tienen recetas individuales
(https://hdl.github.io/containers/ToolsAndImages.html). Cada herramienta se
compila por separado y se guarda en un contenedor vacío (scratch), como si
fuera un tarball o un zipfile. Las imágenes que contienen varias herramientas
se "componen" copiando los "paquetes" pre-compilados y añadiendo las
dependencias "runtime" definidas en las recetas.
Empecé, como casi todos al comenzar con contenedores, instalando todas las
herramientas en un solo Dockerfile y tratándolo como una VM. Si necesitaba
varios contenedores con algunas herramientas iguales y otras diferentes,
recompilaba las herramientas. No era óptimo, pero funcionaba. Con el precio que
tienen los megabytes hoy en día, las velocidades de conexión y los multicores,
era pragmático.
Conforme fui conociendo mejor cómo funcionan los contenedores, empezó a
escocerme un poco más. Sí, las horas de pensar de un ingeniero cuestan más que
estar moviendo contenedores de un lado al otro. Pero que podamos gastar
recursos no implica que esté bien desperdiciarlos.
Lo primero que hice fue utilizar una sola imagen base con las dependencias
comunes. Como las imágenes de contenedores funcionan por capas, si cada
herramienta está en una imagen/contenedor diferente pero todas ellas están
basadas en la misma, no hay overhead (ni en espacio en disco, ni en consumo de
red). Para cada herramienta sólo nos descargamos lo que ocupen ella y sus
dependencias.
Decidí utilizar Debian como imagen base (Stretch, Buster, Bullseye).
Valoré Fedora, pero `dnf update` deja mucha más basura que `apt update`, a
pesar de borrar la cache.
Valoré alpine (que estuvo muy de moda), pero musl y ash son (eran) demasiado
esfuerzo para el objetivo.
Valoré Arch, pero quien decidiera diseñar la CLI de `pacman` no tuvo un buen
día.
En realidad, nunca quise desarrollar/mantener esos contenedores per se. Lo hice
primero para mejorar la CI de un proyecto concreto, y después para satisfacer
mis propias necesidades de desarrollo y docencia. Mi intención era
eventualmente escribir recetas deb "correctas" y upstreamearlas de forma que la
única diferencia entre Debian y mis versiones fuera que ellos usen una version
tagged y yo uso master|main.
Con esa idea, en conjunto con la estructura modular y el uso de una base común,
acabé aterrizando en una solución que tiene el siguiente aspecto:
-
https://github.com/hdl/containers/blob/main/debian-bullseye/boolector/Dockerfile
- https://github.com/hdl/containers/blob/main/debian-bullseye/boolector/HDLC
Un Dockerfile genérico con tres stages (compilar, empaquetar, runtime), y una
receta (en realidad más inspirada en PKGBUILD que en la recetas de Debian) que
contiene las dependencias de compilación, las instrucciones y opcionalmente las
dependencias de ejecución. Los diagramas de
https://hdl.github.io/containers/dev/Graphs.html ilustran qué imágenes y
paquetes se generan con qué dockerfiles/recetas y cuáles son las dependencias
de las imágenes que se componen de varias herramientas.
Un proyecto relacionado que mantengo desde 2019 es https://github.com/dbhi/qus,
que utiliza un contenedor de docker para configurar QEMU static en memoria de
forma que puedan ejecutarse otros contenedores de arquitecturas diferentes.
Anecdóticamente, es de "mis" repositorios el que más estrellas tiene, y me
sorprende para qué lo usa la gente (ejecutar Steam en RPi, o todo tipo de
software en M1). Yo lo uso en hdl/containers para compilar las herramientas y
hacer contenedores para aarch64 (y s390x y ppc64 si no me cuesta esfuerzo) en
integración continua (ya que los runners gratuitos de GitHub son x86; GitLab
creo que tiene alguno para ARM) y también de forma local para compilar para
aarch64 sin tener que cambiar los scripts para hacer compilación cruzada.
Otra característica que añadí el año pasado, es hacer explícita la versión de
cada herramienta en el nombre del contenedor (la imagen, se entiende):
https://github.com/hdl/containers/blob/main/debian-bullseye/gtkwave/Dockerfile#L38-L39.
Como en la industria/comunidad hay cierto a apego a CentOS 6 y 7 (cosa que no
acabo de entender), la estructura del repositorio está pensada para varias
"colecciones" de imágenes, siendo una colección todas aquellas que comparten la
misma base (debia, centos, ...).
Todo lo hago con la integración continua gratuita de GitHub (Actions). Las
imagenes las subo a docker.io<http://docker.io>, ghcr.io<http://ghcr.io> y
gcr.io<http://gcr.io>. Los dos primeros también de forma gratuita, y el tercero
con acceso explícito (aunque desconozco si hay servicio gratuito).
Las imágenes de docker permiten hacer variantes de forma que las capas acaban
formando un arbol. Pero no es posible unir (mergear) las ramas para componer
una nueva images. Por eso, para gestionar la compilación y publicación de
varias imágenes, hay un paquete de Python:
https://github.com/hdl/containers/tree/main/utils.
Hay proyectos de terceros que proveen soluciones para utilizar herramientas
nativas o contenedores de forma "transparente" para el usuario:
https://github.com/olofk/edalize/blob/main/scripts/el_docker o
https://github.com/edaa-org/pyEDAA.CLITool/blob/main/pyEDAA/CLITool/Docker.py.
Los que conocéis o habéis leído sobre nix, supongo que estaréis levantando la
ceja. ¿Estoy/estamos reinventando nix? Tengo la sensación de que parcialmente
sí. Desde luego,
https://github.com/hdl/containers/blob/main/debian-bullseye/gtkwave/HDLC se
parece mucho más a
https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/science/electronics/gtkwave/default.nix
que a https://salsa.debian.org/electronics-team/gtkwave/-/tree/master/debian.
# nix para no morir en el intento?
Mantener hdl/containers ya me lleva más tiempo no pagado del que quiero dedicar.
No sé si es que me estoy haciendo mayor, pero como que empieza a resultarme
igual o más gratificante pasear o estar con la familia.
Es un proyecto muy chulo y se podrían hacer muchas mejoras muy divertidas, pero
ya tiene 5 años y hay que decidir qué batallas no se van a poder librar.
Veo muchas similitudes entre lo que nix puede hacer y lo que yo necesito para
mantener un entorno de trabajo basado en contenedores sin tener que desarrollar
yo mismo la infraestructura de compilación.
Parece que utilizan contenedores para aislamiento al compilar los paquetes y
también como base para después instalarlos con el gestor.
Pero me cuesta mucho entender qué no es nix. Parece ser un sistema
(distribución), un gestor de paquetes (que puede usarse en cualquier otro
sistema), un reemplazo para las Dockerfile (que no sé si es el mismo lenguaje
que el de las recetas, o si ese lenguaje tiene algún otro uso), una solución
para usar contenedores ligeros en la nube... Me da la sensación de que intenta
abarcar demasiado en un mismo paraguas. O son genuinamente brillantes, o están
cogiendo uno o varios atajos de los que o no son conscientes o no los están
explicando de forma que yo pueda entenderlo.
Por ejemplo, no quiero instalar nix en un contenedor para después instalar
paquetes con ello. Quiero que nix genere un contenedor con esos paquetes y que
nix no esté instalado en el contenedor.
https://nix.dev/tutorials/building-and-running-docker-images tiene muy buena
pinta, pero no parece posible especificar la imagen base del contenedor. Viendo
https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/docker/examples.nix,
sí parece posible especificar cualquier imagen base, pero es un ejemplo de 850
líneas...
Si intento leer https://nixos.org/guides/how-nix-works.html, la segunda frase
me tumba: "This means that it treats packages like values in purely functional
programming languages such as Haskell — they are built by functions that don’t
have side-effects, and they never change after they have been built". Toda la
explicación posterior me suena muy bien, si estuviera buscando un reemplazo
para apt o dnf que pueda gestionar multiples versiones de las
herramientas/librerías, de forma similar a Conda o los venv. Pero no es eso lo
que estoy buscando. Me falta la parte de que una herramienta sea un contenedor
en vez de una carpeta local.
En cuanto a NixOS, me resulta temerario. Jugar con contenedores y aplicaciones
en la carpeta de usuario guay, pero toquetear el sistema base :S. El sistema
puede y debe ser robusto/estable, porque de ello dependen poder jugar con el
resto. Debian hace un muy buen trabajo de filtro paso bajo para tratar de
garantiarlo. Cuestiones como
https://lists.debian.org/debian-devel/2008/12/msg01027.html son las que me
gusta saber que plantea quien desarrolla/mantiene el sistema base.
# Sistemas inmutables
La primera vez que leí sobre el concepto fue por CoreOS. Lo que vagamente
recuerdo es que proponían que todo el sistema operativo estuviera basado en
contenedores. El kernel sólo, y todo, hasta systemd, en contenedores. Era
2014-2015 y me pareció una alucinación, una sobreexcitación con el juguete
nuevo.
Creo que llegué a probarlo porque si no me equivoco el concepto usaba alpine
como base.
Posteriormente, he intentado buscar sobre el concepto varias veces, pero no lo
he encontrado.
En 2018 Red Hat compró CoreOS
(https://www.redhat.com/es/technologies/cloud-computing/openshift/what-was-coreos),
por lo que todo aquello ha acabado en las herramientas y engines de
contenedores de segunda generación. El nombre CoreOS en sí acabó asociado a una
distribución liviana pensada para ejecutarse en VM en la nube, sobre la que
correr contenedores. Pero creo que la idea de que el sistema en si fuera basado
en contenedores no cuajó. En 2020 RedHat abandonó el proyecto, pero sigue
existiendo https://fedoraproject.org/es/coreos/.
Fedora SilverBlue parece ser lo mismo que CoreOS, pero aplicado al escritorio:
https://silverblue.fedoraproject.org/about. Es decir, la "inmutabilidad" se
basa en que el sistema base es tan pequeño que te resulta más fácil borrarlo
todo y bajarte una versión nueva completa, que intentar actualizar el que
tienes. Tratar el sistema base del equipo de escritorio como si fuera el
sistema base de una VM donde lo único que se van a ejecutar son contenedores.
Puede que no consiguieran aislar systemd del sistema base (o que no tuviera
sentido al fin y al cabo) por lo que la solución es que la única diferencia
entre el sistema base y los contenedores sea que el primero tenga systemd "y
poco más".
Pero me pierdo con dónde queda la detección de hardware y los drivers. Entiendo
toda la configuración de escritorio, configuraciones de usuario, aplicaciones,
sistema de ventanas, etc. Entiendo que el kernel es el kernel. Pero, entre
arrancar un kernel de una versión nueva del sistema y acceder/utilizar todas
esas configuraciones, ¿la detección y configuración de hardware? ¿Son sólo
ficheros de configuración también? ¿No hay que descargar contenido al sistema
base que no esté aislado (como sí lo están las aplicaciones) rompiendo la
inmutabilidad? He de decir que tengo un poco de cacao en este sentido porque sé
que NVIDIA permite usar una GPU en un contenedor con unos drivers que estén en
otro contenedor, pero tampoco acabo de entender cómo funciona. Igual SilverBlue
es "casi" inmutable ya ya esta.
A diferencia de NixOS, sí confio en la propuesta de Fedora/CoreOS. Herramientas
como podman han se han nutrido de ese germen, y poder ejecutar contenedores sin
un servicio con permisos de root supuso un punto de inflexión en la viabilidad
de los contenedores donde la seguridad es relevante (aunque creo que sigue sin
ser un sandbox). Fedora tiene un ancho de banda mayor que Debian, y estas
herramientas se han probado ahí.
Pero, a efectos prácticos, utilizo Fedora en el escritorio de la uni y en el
portátil desde el que escribo. En este portátil tengo la misma instalación
desde 2017, y no hay casi basura precisamente porque empecé usando contenedores
aquí.
SilverBlue me propone utilizar flatpak o contenedores en vez de dnf o
contenedores. Yo ya utilizo contenedores principalemente, por lo que flatpak o
dnf para las 4 cosas básicas lo mismo me da.
En tema de hardware y drivers, no veo qué me da.
Lo único que sí me ha hecho pensar es lo de aislar el navegador. Puede que sí
tenga sentido empezar a enjaular Firefox, ya que cada vez más aplicaciones
dependen del navegador.
No obstante, cuando empecé a usar software libre, me resultó muy difícil
cambiar de Windows, Office y Explorer, a Ubuntu, OpenOffice y Firefox.
Lo intenté varias veces y no pude. Al final, lo que hice fue cambiar las
aplicaciones primero. Empecé a usar OpenOffice y Firefox en Windows. Cada ve
que tenía que usar una nueva aplicación, buscaba una alternative libre, en
Windows.
Al cabo de unos años, cuando todas las aplicaciones que usaba/uso eran software
libre, cambié el sistema porque ya lo único que me quedaba por aprender era el
escritorio.
Del mismo modo, para quien no ha utilizado nunca (o poco) venv, snap, appimage,
conda, contenedores, etc. utilizar por ejemplo flatpak en fedora o snap en
ubuntu creo que puede ser didáctico para exponerse al "aislamiento" de las
aplicaciones y datos de forma paulatina y empezar a pensar en terminos de ¿y si
no tuviera que formatear el sistema nunca? ¿y si considerara esa tarea vintage?
# Hipervisores, VMs, LXC, docker|podman
A mayores, CoreOS sí lo veo interesante como sistema base para VMs en sistemas
con hipervisor.
Llevo varios meses utilizando Proxmox en un par de máquinas del laboratorio y
una en casa, y estoy encantado.
Tanto que me planteo usarlo como sistema base en mi equipo principal (cuando
tenga más de cuatro cores), y virtualizar el sistema de escritorio.
Básicamente es Debian con QEMU KVM y una capa de software (en perl) que provee
una GUI web.
Soporta VMs y contenedores LXC, además de opcionalmente backups y agregación de
varios nodos en clusters.
Yo lo uso sólo como gestor de VMs y contenedores por ahora.
En 2-3 días, conseguí crear una VM con Windows 11, otra con Ubuntu,y configurar
una GPU para que la ignore el sistema base y se conecte a una de las VMs.
Llevamos meses utilizándolo intensivamente sin problemas.
En Proxmox, los contenedores que pueden ejecutarse de forma nativa son LXC, no
los OCI (docker|podman).
Por lo tanto, lo más immediato para ejecutar multiples contenedores OCI es
crear una VM y utilizar podman ahí.
En esa VM tiene sentido utilizar CoreOS, en vez de Alpine o Ubuntu Server.
El Debian base no tiene entorno gráfico, por lo que puede hacerse tediosa la
gestión de ficheros.
Si la VM tiene SilverBlue en vez de CoreOS, se puede utilizar nautilus o el
explorador que se desee para organizar el contenido.
Así, de Proxmox me parece interesante poder tener:
- Debian como base.
- Un Windows y un Linux como sistemas principales que pueden o no ejecutarse
concurrentemente.
- Una máquina auxiliar con linux para tener "servicios" (e.g. bittorrent,
jellyfin) ejecutados con contenedores.
- Poder crear o clonar VMs puntualmente para hacer pruebas y después borrarlas,
sin que nada de ello tenga que ver con el escritorio (windows y/o linux).
- Igualmente, poder usar contenedores en VMs temporales.
- Curiosidad por aprender cuáles son las diferencias entre LXC y OCI.
Eso para un sistema con >=6 cores y >=16 GB de RAM no es carga. La VM auxiliar
puede usar 1-2 cores y 2-4 GB, por lo que la principal (que viene a ser el
escritorio) sigue siendo un pepino de al menos cuatro cores y 12 GB.
Es decir, la inmutabilidad en este caso es que el sistema base y el escritorio
no son el mismo. Todas las otras soluciones que estamos comentando presuponen
que el sistema principal es donde están las X (Wayland) y tratan de aislar todo
lo demás. Por mi experiencia, las X (y los drivers de las GPUS, y Wayland) son
una fuente relevante de inestabilidad y/o problemas tras actualizaciones.
Pero soy muy consciente de que roza el límite del pragmatismo. Es una solución
razonable si sé que voy a usar siempre al menos 2 o 3 VMs (o contenedores).
Pero es, de facto, como tener y mantener 2/3 ordenadores (sistemas), cosa que
razonablemente la mayoría de usuarios no quieren hacer. Yo lo veo natural
porque como digo ya utilizo al menos 4 equipos a diario.
La razón por la que no he dado el paso en mi equipo principal aún es porque no
quiero tener dos juegos de teclado y ratón conectados al equipo (uno para el
host y otro para la VM de escritorio). He resuelto que el host utilice uno
monitor y la VM gestione el resto. También que un hub USB vaya a la VM (para
pendrives, discos externos, etc.). Pero todavía tengo que mirar cómo de
complicado y sobre todo reliable es utilizar una combinación de teclas para
cambiar los periféricos de un sistema a otro.
Por la tecnología que usa, creo que Proxmox entra en la categoría de
https://katacontainers.io/ y QubesOS.
karacontainers en vez de ejecutar un contenedor directamente, crea una VM con
QEMU KVM, instala un sistema mínimo y ejecuta el contenedor ahí. Lo hace
mediante el runtime de los contenedores, por lo que esa es la diferencia con
respecto a Proxmox o la utilización explícita de QEMU. El usuario ejecuta los
contenedores usando los mismos comandos que usaría en una instalación de docker
normal, pero por debajo de forma transparente kata hace y destruye la VM.
Anecdóticamente, lo descubrí porque un servidor de la Universidad de Manchester
se comportaba raro con algunos contenedores y resultó ser que el demonio estaba
configurado para usar kata por defecto.
Siempre me ha parecido que es interesante para datacenters donde es importante
el aislamiento entre usuarios.
Pero para mis casos de uso no veo ventaja. Yo no ejecuto nada en contenedores
que no ejecutaría nativamente en el host. No los utilizo para seguridad, sino
como herramienta de empaquetado y distribución de entornos de software
"ready-to-use".
A mayores, cuando katacontainers surgió, podman estaba muy verde. Hoy en día no
sé si podman resuelve ya los problemas que katacontainer intenta atajar
incluyendo QEMU en el stack.
En cuanto a QubesOS, me está haciendo pensar, mucho. No entiendo qué diferencia
hay entre KVM y Xen, pero si la UX es parecida tampoco me importa. Me gusta
mucho que en https://www.qubes-os.org/intro/ haya una GuiVM, una sys-usb VM y
una sys-net VM con el logo de Fedora. Parece que han resuelto que las ventanas
de multiples VMs se muestren en el mismo escritorio
(https://en.wikipedia.org/wiki/Qubes_OS#/media/File:Qubes_security_domains.png).
Con Proxmox, cada VM tiene un monitor virtual (en la VM QEMU), al que luego el
host permite acceder por VNC. O, si la máquina es Windows, se puede usar RDP
exponiendo el puerto (o tunelándolo). Por eso, de facto, hace falta varios
monitores si se utilizan GUIs en varias máquinas; o xpra.
Al usar contenedores (docker o podman) el tema de las GUI es algo que suele
echar atrás. Por defecto, no se pueden usar GUIs porque no hay monitor ni
gráfica dentro del contenedor. De las varias soluciones (instalar SSH o VNC
dentro del contenedor, que la GUI sea web y se use con un navegador en el host,
etc.) la que más me gusta es https://github.com/mviereck/x11docker. Como se
indica en https://github.com/mviereck/x11docker#features, el desarrollador
tiene interés notable en la seguridad, por lo que además de permitir ejecutar
GUIs en contenedores usando el escritorio del host, aplica muchas opciones para
limitar el alcance de los contenedores. Como en el desarrollo hardware es
habitual utilizar GUIs, estoy acostumbrado a tener múltiples ventanas en el
escritorio, cada una proveniente de un contenedor. De hecho, así es como uso
varias herramientas de Linux en un escritorio Windows. Hay un GIF/grabación en
https://hdl.github.io/containers/ug/GUI.html. Una referencia obligada es
https://blog.jessfraz.com/post/docker-containers-on-the-desktop/ (nótese la
fecha).
En este sentido, QubesOS parece ofrecer una UX muy similar, pero con VMs en vez
de contenedores.
Me surgen varias dudas:
- ¿Por qué VMs y no podman? Que los qubes se puedan crear sobre Xen o como
contenedores en la AppVM principal.
- ¿Es possible hacer passthrough de discos, GPUs u otros periféricos a una
AppVM con Windows 10|11? Entiendo que la AppVM 1, la principal, no puede ser.
Esa tiene que ser linux (en el diagrama Debian), del mismo modo que el host de
Proxmox es Debian. Que el diagrama muestre el logo de Windows 7 mosquea un poco.
- ¿Cómo de fácil es hacer una VM "tradicional"? Me refiero a una que no esté
integrada en el sistema, como el resto. Sino simplemente asignar número de
CPUs, cantidad de RAM, periféricos (virtuales o físicos) y tratarlo como una
caja cerrada. Si todas las VMs se consideran parte del sistema, entiendo que en
principio no estáran limitadas en cuanto a recursos (en
https://www.qubes-os.org/attachment/doc/r4.0-qubes-manager.png sólo se muestra
el disco), pero para otros servicios auxiliares es importante. De hecho, en
Windows utilizo Docker con HyperV y huyo de WSL2 porque HyperV permite limitar
las cpus y memoria, pero WSL2 no.
Mayo viene cargadito, pero sin duda tomo nota de QubesOS para probarlo en
verano.
Eskerrik asko por sacar el tema, espero que algo de esto te/os resulte
interesante/útil y mesedez comentanos si decides probar alguna!
Salud
Unai
El jue, 20 abr 2023 a las 7:58, Christian Pinedo Zamalloa
(<[email protected]<mailto:[email protected]>>) escribió:
Aupa,
llevo muchos años ya siendo fiel a ArchLinux pero con el tiempo tanto las
rolling release como las distros clásicas basadas en releases se convierten en
un pequeño estercolero con restos de todas las pruebas que has ido realizando,
cambios de configuración, entornos gráficos, lenguajes de programación,
ajustes... Esto me genera dos preocupaciones en el día a día:
1. la estabilidad del sistema operativo
2. la seguridad del sistema operativo
Para (1) haces apaños como btrfs con snapshots. Para (2) actualizas, firewall,
luks, pruebas firejail/bwrap para hacer una "jaula" a firefox y otros...
Pero da la sensación que todo lo complicas más.
En este aspecto las nuevas distros inmutables como Fedora Silverblue/Kinoite,
OpenSUSE MicroOS y VanillaOS parece que son un aire fresco. Tengo un sistema
base "inmutable" al que después de actualizar puedo hacer rollback. Esto mejora
la estabilidad del sistema operativo, tambien la limpieza porque se complica
instalar software nuevo en esa capa base de sistema operativo, la gestión de la
configuración es otro mundo (creo que no la abordan) y te obliga a instalar
aplicaciones con flatpak/appimage/snap/nix o directamente a usar contenedores
con toolbox/distrobox. Creo que es un sistema más complejo pero te obliga a un
workflow en el que el sistema operativo base lo tocas lo mínimo, todo más
limpio. Y creo que mejora la seguridad (menos aplicaciones en el sistema
operativo base, en Fedora Silverblue/Kinoite viene SELinux activado...).
En general es como tener un sistema operativo "hipervisor" "base" que es más
robusto y tocas lo menos posible.
Aqui tambien podría entrar en juego QubesOS que esta muy enfocado a la
seguridad. Pero tiene ese concepto de sistema operativo base hipervisor limpio
y seguro. Y todo tu trabajo lo realizas con Máquinas Virtuales que vas creando
y destruyendo. Ahora bien necesitas un pepinaco de PC en CPU, RAM y SSD/NVMe
para que las aplicaciones se arranquen ligeramente. Y la usabilidad y libertad
esta muy mermada por su forma de uso. Yo con mi thinkpad x250 se me hacia muy
lento...
Por otro lado, estan distros como NixOS y Guix que aqui ya me pierdo. Que deben
tener peculiaridades con esas distros inmutables (Fedora Silverblue/Kinoite,
MicroOS...) pero que no aportan exactamente lo mismo. Me pierdo aqui...
¿Tenéis experiencia con distros inmutables? ¿las recomendais?
¿Alguno ha dado el paso hacia NixOS/Guix? ¿Que aportan? ¿ventajas
inconvenientes? Incluso, aunque solo sea al gestor de paquetes ¿nix?
¿Somos de la vieja escuela y seguimos con Debian, Ubuntu, ArchLinux? :-D
Saludos!
--
Christian
PGP fingerprint: A895 7C11 84F6 30B4 4938 32A4 9306 DFD0 CDE4 B542
_______________________________________________
ITSAS mailing list
[email protected]
http://list.ehu.eus/mailman/listinfo/itsas
_______________________________________________
ITSAS mailing list
[email protected]
http://list.ehu.eus/mailman/listinfo/itsas