Usando containers con systemd

Una funcionalidad tal vez poco conocida de systemd es la capacidad de correr containers sin necesidad de lxc o docker. Debajo describiremos brevemente dos de sus componentes.

¿Qué es systemd-nspawn?

  • Un container de espacios de nombres liviano para comandos o sistemas operativos
  • Virtualiza
    • La jerarquía del sistema de archivos
    • El árbol de procesos
    • Subsistemas de IPC
    • El nombre del host y del dominio
  • No se puede desde el container:
    • Modificar las interfaces de red del host
    • Cambiar el reloj del del sistema
    • Crear archivos de dispositivos
    • No se puede reiniciar el host
    • No se pueden cargar módulos del kernel del host
  • Para crear containers se usa:
    • dnf
    • debootstrap
    • pacman

¿Qué es systemd-machined?

Es un servicio que mantiene un seguimiento de las máquinas virtuales y containers y de los procesos que les pertenecen.

Como crear un container Debian

sudo debootstrap --arch=amd64 stretch /var/lib/machines/stretch-2

Como listar images

# machinectl list-images

Como setear la password de root en un container

Para setear la password de root ingresamos el siguiente comando: # systemd-nspawn -UD /var/lib/machines/stretch-2

La opción -U hace que se active el espacio de nombres de usuario. Se selecciona números de UID y GID al azar como dueño del directorio raíz del container y de ser necesario se realizan los ajustes de permisos y ACLs necesarios.

Como preparar el container

Para poder establecer la comunicación entre el host y el container es necesario instalar en este último el paquete systemd-container, de manera que ejecutamos en el mismo:

# apt-get update && apt-get install systemd-container

Luego salimos con Ctrl-D

Como arrancar un container

# machinectl start stretch-2

Como loguearse al container

# systemd-run --machine stretch-2 --pty /bin/login

Otra manera posible es:

# machinectl login stretch-2

Como configurar la red en el container

Hay varias maneras de configurar la red en el container, una manera es aprovecharse de una opción que utiliza systemd:

En resumen, --network-veth : - Crea un enlace virtual entre el host y el container. - La interfaz del host se llamará ve-MACHINE_NAME. Donde MACHINE_NAME será el nombre del container.

  • La interfaz del container se llamará host0.

Tras activar las dos interfaces y darle direcciones IP apropiadas, el host y el container podrán comunicarse por red.

El problema con esta configuración es que el container no tiene manera de acceder al mundo exterior, más allá del host. Ni siquiera configurando al host como default gateway. La manera de solucionarlo es sencilla: arrancando tanto en host como en container el servicio systemd-networkd y luego lanzando el cliente dhcp en el container.

Aquí vemos la configuración asignada al container:

Aun así, tuve que configurar el archivo /etc/resolv.conf a mano.

Como ver el estado de un container

# machinectl status stretch-2

Otra opción es:

# systemctl status systemd-nspawn@stretch-2.service

Conclusión

Teniendo en cuento que la mayoría de las distribuciones actuales más utilizadas usan systemd, es útil contar con un gestor de containers directamente integrado. Seguramente no reemplaza a otras soluciones más sofisticadas, pero para hacer demostraciones, debugging y testing es una excelente opción.

Paz y Propósito

En la materia de la Tierra había pensado Aulë, a quien Ilúvatar había concedido una capacidad y un conocimiento apenas menores que los de Melkor; aunque lo que deleita y enorgullece a Aulë es la tarea de hacer y las cosas hechas, y no la posesión ni su propia maestría; por tanto da y nos atesora, y está libre de cuidados, emprendiendo siempre nuevas tareas.

El Silmarillion, JRR Tolkien

En las organizaciones de todo tipo podemos encontrar al menos estos tres tipos de disfuncionalidades:

Autoestima deficiente

Si una persona no tiene una autoestima sana, buscará algunos de estos métodos para disfrazar o aliviar ese padecimiento:

  • Involucrarse en tareas que no coinciden con sus mejores habilidades
  • Buscar la propia valía a través de tareas que termina superando y agotando sus recursos
  • Desplazar a quienes se interpongan en su camino
  • Forzar acontecimientos
  • Decir lo que otros quieren, pero no formar y hablar con voz propia
  • Culpar a otros por fracasos propios
  • No reconocer el mérito por los logros propios
  • La ausencia de protagonismo
  • Insatisfacción
  • Bronca y en casos extremos, odio
  • Obsesión por las metas y poca satisfacción en el recorrido a la misma
  • Es muy común la búsqueda de poder "sobre" en lugar de poder "para".
  • Ver la vida como un juego de suma cero: "Para ganar, otro tiene que perder"

El mensaje del emisor se percibe distinto de acuerdo al receptor

Este es un fenómeno prácticamente universal, ya que todos tenemos tendencias y hábitos de comportamiento e historia personal única. Cada vez que comunicamos algo es interpretado por el otro de manera distinta al contenido e intención de mensaje original. Cuanta más diferencia halla en esa interpretación mayor es la probabilidad de conflicto.

Comunicación inoportuna

Si bien sería absurdo buscar un momento ideal o perfecto para comunicar algo, a veces un mensaje antes o después de algún momento puede también generar malentendidos, conflictos, retrasar o frustrar la resolución de un problema.

Podemos hablar horas, asistir a cursos y conferencias sobre Project Management, ITIL, metodologías ágiles, DevOps y muchos conceptos más, algunos más de moda que otros, pero si ignoramos estas disfuncionalidades solamente estaremos cambiando de problemas, no resolviéndolos.

Algunas propuestas para eliminar esas disfuncionalidades podrían ser:

  • Conocernos mejor
  • Hablar con nuestra propia voz
  • Desarrollar el sentido de la oportunidad
  • Entender que hay una vida más allá del "poder sobre". Que también existe el goce y el disfrute por aprender y por hacer
  • Entender que no somos omnipotentes, pero aun así somos protagonistas

En definitiva, que podamos hallar 'paz y propósito'. Que es en realidad algo bastante más concreto de lo que podríamos pensar.

Eligiendo Hostname

¿No les pasó muchas veces crear un host y no saber qué nombre ponerle? A mi me pasó. Hace un tiempo había encontrado un script que realizaba esa función. No me acuerdo cuál ni donde. De todas maneras , tenemos la manera de crear de fácilmente un nombre de host de manera aleatoria. Por ejemplo, el archivo /usr/share/dict/wordstiene una buena cantidad de palabras en inglés. Este archivo pertence al paquete words y la lista de palabras proviene del Moby Project. Bien, ya tenemos una lista de palabras. Ahora necesitamos alguna herramienta que elija al azar líneas de un archivo. A tal fin podemos usar shuf:

Si estamos intrigados sobre el significado de la palabra encontrada podemos buscarlo en wikipedia por medio de la herramienta wikit:

Otra manera sería usar los archivos de hunspell. Hunspell es el corrector ortográfico de LibreOffice, Firefox y Thunderbird, entre otros proyectos.

Si queremos tener un adjetivo y un sustantivo:

paste -d'-' <(tr ' ' '\n' < /usr/share/wordnet-3.0/dict/adj.exc|shuf -n1) <(tr ' ' '\n' < /usr/share/wordnet-3.0/dict/noun.exc|shuf -n1)

Y podemos hasta obtener el hostname con diseño:

Más información

VIM + Markdown = Sorprendente

¿Qué es?

En artículos anteriores ya habíamos hablado acerca de Markdown. VNote es una aplicación para tomar notas, diseñado especialmente para Markdown. Pero no es otro editor más. No posee doble panel como ReText o Haroopad. Tampoco es WYSIWYG como Typora o Mark Text. El problema con el primer enfoque es que contar con dos paneles no favorece a la concentración. La segunda táctica contradice en cierta manera el espíritu de markdown que es la capacidad de tener control sobre lo que se está escribiendo.

El intento de VNote por acortar la distancia entre escritura y lectura que ofrece Markdown es muy ingenioso. Recuerda al WYSIWYM del editor LyX. Claro, la diferencia es que markdown es por lejos, mucho más amigable que LaTeX.

VNote usa libretas, carpetas y notas para la jerarquía de las notas para administrar las notas. Este principio de una 1 nota, 1 archivo favorece la gestión por parte del usuario. Algo que no ocurre con otros intentos como MindForger, por citar un ejemplo.

Ficha

VNote
Author: Le Tan
Licencia: MIT
Sitio Web: tamlok.github.io/vnote

¿Para qué sirve?

  • Para escribir notas y organizarlas
  • Los siguientes usos no fueron parte principal del propósito que tuvo en mente el desarrollador, no obstante, se puede adaptar bastante bien para:*
    • Para escribir artículos técnicos
    • Para escribir posts para un blog
    • Para escribir documentación

Funcionalidades

  • Facilita el ingreso de textos frecuente (Snippets)
  • Expansión de palabras permite el ingreso de la fecha actual, nombres y otros textos de manera rápida (Word Magic). Viene con una lista predeterminada, pero se pueden agregar más a la misma
  • Plantillas
  • Temas y estilos
  • Guarda sesiones, es decir permite seguir trabajando con los mismos archivos que teníamos abierto en la sesión anterior
  • Exportación: Markdown con sus imágenes y adjuntos en una carpeta para distribuir, motor interno para convertir a pdf. También soporta la conversión usando wkhtmltopdf u otro comando personalizado.
  • Potente motor de búsqueda, que permite buscar entre una o más notas e incluso por tags de las mismas.
  • MathJax para interpretar ecuaciones matemáticas $$ a^2 + b^2 = c^2 $$
  • Diagramas mediante Mermaid o Flowchart
graph TD
A(VNote)-->B[Qué es];
     A-->C[Para qué se usa];
     A-->D[Funcionalidades];
     A-->E[Como instalarlo];
     A-->F(Conclusión);

  • Soporte para emojis

    Por favor no vote a un :cat:

emojis

  • Pestañas
  • Modo vim

Conclusiones

Me gusta que tenga un modo lectura y un modo edición, en lugar de código puro y panel para previsualizar, el modo Vim es sorprendente y para mis preferencias y necesidades lo convierte en un claro ganador frente a otras alternativas. Asimismo, la impresión que genera VNote es la de un proyecto que se ha interesado en detalles que a veces se pasan por alto en proyectos Open Source.

¿Buscando Más?

Mark Text: Markdown en tiempo real

Hace algún tiempo había escrito sobre Typora un editor de markdown excelente, pero que lamentablemente no es software libre. Pero hace unos días descubrí a Mark Text que hasta donde se es el primer editor de texto libre que interpreta automáticamente markdown. ¿Qué quiero decir con esto? Que si tipeamos lo siguiente:

**importante**

Lo transformará inmediatamente en:

importante

Otras funcionalidades que posee Mark Text son:

  • Autocompleta tags
  • Abre y cierra automáticamente:
  • Comillas ''
  • Corchetes []
  • Paréntesis ()
  • Llaves {}
  • Emojis
  • Resalta código fuente de acuerdo al lenguaje
  • De ser necesario además, propociona una vista en código fuente.
  • Formatea fórmulas matemáticas, por ejemplo, aquí debajo vemos el Teorema de Bayes:

$$P(A_i|B) = \frac{P(B|A_i) P(A_i)}{P(B)}$$

😢 Mark Text llamativamente no interpreta HTML Mark Text interpreta html en bloque, por ejemplo:

<H1>
  Encabezado 1
</H1>

Pero no html crudo:

<H1>Encabezado 1</H1>

Más allá de este y otros glitches no invalidan esta aplicación, y teniendo en cuenta la gran comunidad que tiene seguramente se convertirá en una gran alternativa para Typora.

Fuente de los "Hola Mundo": Anexo:Ejemplos de implementación del «Hola mundo» - Wikipedia, la enciclopedia libre

Como medir la memoria compartida

Medir la memoria RAM es una tarea complicada. Podemos ejecutar el comando ps y somar los valores de una determinada columna, pero no nos va a dar el resultado correcto. Los sistemas operativos actuales como Linux usan memoria virtual, esta les permite utilizar parte de la memoria RAM que necesita cada aplicación y sobreasignar la cantidad de memoria RAM, simulando que poseen mucha más memoria. Además, la mayoría de los programas usan librerías compartidas. Entonces al abrir otra aplicación que usa la misma librería que otro programa en ejecución ahorra cierta cantidad de memoria RAM. Por ejemplo, supongamos que queremos ver la cantidad de memoria que consume Firefox, si lo intentamos con ps:

ps -Cfirefox -o vsz --no-headers | awk '{ sum += $1 } END { print sum/1024/1024 }'

Eso da como resultado (en este caso particular) 3.75465 GB ¿Parece mucho, no?

En realidad ese resultado es poco significativo. El campo vsz es el tamaño de la memoria virtual que usa un proceso. Esto es: la memoria física realmente utilizada más memoria que el proceso puede llegar a necesitar en algún momento, más la memoria swap empleada.

Podríamos medirlo con un parámetro un poco más exacto tal como ls RSS. RSS (Resident Set Size) es la cantidad de memoria asignada a ese proceso y está en RAM. No incluye swap. Incluye la memoria de librerías compartidas siempre que las páginas de esas librerías estén en memoria.

Estos serían los resultados

pgrep -f /usr/lib64/firefox | xargs ps -o rss --no-headers | awk '{ sumrss += $1 }  END { print sumrss/1024/1024  }   '
2.92811

Pero existe una herramienta llamada smem que mide valores más útiles, estos son PSS y USS. PSS divide los bloques de memoria virtual compartida por la cantidad de procesos que en ese momento tienen una entrada en la tabla que traduce direcciones virtuales a físicas para la página. Dicho de otro modo la memoria compartida se divide por la cantidad de procesos que la usan.

Además, smem informa acerca de USS que es la memoria que no está compartida con otros procesos.

smem -tk -P/usr/lib64/firefox

Como se puede apreciar una diferencia de 17% respecto a la RSS

Además, smem puede mostrar la información de manera gráfica:

Fuentes y recursos adicionales

ranger

ranger es un gestor de archivos de consola con atajos de teclado de VI. Proporciona una interfaz minimalista y bonita basada en curses con una vista en la jerarquía de directorios. Viene con rifle, un lanzador de archivos bueno para encontrar cual programa usar para cada tipo de archivo.

Tenemos entonces un administrador de archivos fácilmente mantenible en un lenguaje de alto nivel. Una manera rápida de cambiar de directorios y navegar el sistema de archivos. Es pequeño pero útil, hace una cosa y la hace bien. Al estar basado en la consola, con una fácil integración en la shell de unix.

Desde ranger podemos ir a una shell (S mayúscula mediante) y volver a ranger (con exit). Además, posee atajos similares al viejo Midnight Commander con las teclas de función. Mediante w3m-img podemos previsualizar imágenes. Además, buscar archivos, cambiar archivos, crear directorios, renombrar archivos, etc.

No reemplaza a herramientas gráficas como Dolphin, pero sin duda es bueno tenerlo a mano cuando necesitamos la rapidez y la eficacia de la consola de texto.

Enlaces

Latte Dock

De acuerdo a su descripción:

Latte Dock es una barra de tareas basada en los frameworks de plasma que proporciona un elegante e intuitiva experiencia para las tareas y plasmoides. Anima sus contenidos por medio de efectos de zoom parábolico e intenta aparecer solamente cuando se la necesita.

Latte Dock fue creado por Michail Vourlakos. Creo que es un buen candidato a ser el panel predeterminado en KDE Plasma. Si bien faltan pulir algunas cosas, es muy configurable, relativamente fácil de usar y muy elegante. Tiene al menos 3 esquemas de configuración (además de uno personalizado): Unity - que recuerda al fallido entorno creado por Ubuntu - , Plasma y Extended.

Aquí algunas imágenes del mismo:

Enlaces:

5 ejemplos con journalctl

Las siguientes son ejemplos de consultas que podemos hacer con journaltcl:
  • ¿Cómo busco un comando o aplicación?
    journalctl \_COMM=master
  • ¿Cómo busco un usuario?
  • journalctl _UID=1000”
  • ¿Cómo veo los logs en un intervalo de tiempo?
    journalctl -S 2017-12-11 -U “2017-12-13 12:15”
  • ¿Cómo busco una determinada unidad?
    journalctl -u httpd
  • ¿Cómo veo los (posibles) problemas?
    journalctl -p notice

journalctl

Lo viejo, lo bueno y lo nuevo en Neovim

Características

El editor Neovim se presenta como el sucesor del editor Vim.

  • El conector entre componentes de software, MessagePack de manera eficiente intercambia datos en binario y sirve para intercambiarlos en lenguajes tales como JSON.
  • Los plugins remotos son coprocesos que tienen un canal de comunicación por medio de RPC con el proceso de neovim. Estos plugins además se ejecutan de manera asíncrona, mejorando así el rendimiento.
  • Una configuración predeterminada más potente y amigable.

La configuración predeterminada incluye las siguientes funcionalidades:

  • Cuando se detecta que un archivo ha sido cambiado dentro de Vim, automáticamente lo lee de vuelta.
  • Permite borrar una autoindentación,  saltos de línea y al comienzo de inserción.
  • Ahora los directorios de backup están en ~/.local/share/nvim/backup siguiendo las directrices xdg [^1]
  • Resalta los resultados coincidentes de búsquedas
  • Realiza búsquedas incrementales
  • Muestra siempre la línea de estado
  • Ahora se pueden ver mejor las tabulaciones y espacios al final de cada línea
  • Muestr el comando que se está ejecutando
  • Manejo más inteligente de tabulaciones
  • Asume una terminal de conexión rápida
  • La campanilla está deshabilitada para todos los eventos
  • El directorio para temporales está en ~/.local/share/nvim/swap [^1].
  • El comando display muestra la última línea de los registros.
  • Justifica automáticamente usando el ancho del texto, inserción y borrado inteligente de caracteres de comentarios.

Configuración

  • En $HOME creamos un enlace:

lrwxrwxrwx 1 sergio sergio 19 nov 5 23:30 init.vim -> /home/sergio/.vimrc

  • Y también en $HOME/.config:

lrwxrwxrwx 1 sergio sergio 17 nov 5 23:30 nvim -> /home/sergio/.vim

  • En $HOME/.vimrc
if has(‘nvim’) 
  Plug ‘Shougo/deoplete.nvim’, { ‘do’: ‘:UpdateRemotePlugins’ } 
  Plug ‘vim-airline/vim-airline’ 
else 
  Plug ‘Shougo/deoplete.nvim’ 
  Plug ‘roxma/nvim-yarp’ 
  Plug ‘roxma/vim-hug-neovim-rpc’ 
  python3 from powerline.vim import setup as powerline_setup 
  python3 powerline_setup() 
  python3 del powerline_setup 
  set laststatus=2 
  set t_Co=256 
endif 
 
let g:deoplete#enable_at_startup = 1 
 
neoterm 
Plug ‘kassio/neoterm’ 
 
“call vundle#end()            “ required 
call plug#end() 

Nuevas funcionalidades provenientes de plugins

Algunos de estos plugins son:

  • far.vim: Buscar y remplazar, abre un panel de vista previa.
  • deoplete.nvim: Autocompletar.
  • floobits: Etherpad usando neovim.
  • neoterm: Terminal embebida.
    neoterm
  • vim-pandoc: Integración con el conversor de lenguajes de marcas ligeros pandoc.

Conclusión

El editor VIM es una extraordinaria herramienta, no obstante adolece de disparidad en sus configuraciones predeterminadas, algunos inconvenientes de rendimiento e integración con otros componentes de software. Neovim viene a responder a estos inconvenientes y por ahora lo está haciendo muy bien. De hecho, VIM en su versión 8, incorporó muchas mejoras provenientes de Neovim. El tiempo dirá si los proyectos se terminan fusionando. Lo importante es que tenemos una alternativa moderna al casi treintañero VIM.

Notas

[ ^1 ]: Freedesktop.org