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

Buku: Reduciendo el ruido de la web

El navegador Mosaic ya en 1993 contaba con la posibilidad de guardar los documentos favoritos de la web. En la actualidad, con conexiones de banda de ancha grande el uso de marcadores parece haber declinado. Muchas veces, nos da igual guardarlo como favorito, como buscarlo en el historial del navegador o buscarlo nuevamente en Google, DuckDuckGo, Gigablast, etc. No obstante, si queremos mantenernos enfocados en nuestro trabajo y/o estudio, es muy conveniente tener nuestra propia selección de sitios web de interés.

Buku es un poderoso gestor de marcadores/favoritos escrito en python, utiliza el analizador de HTML/XML para extraer datos. Estos últimos se guardan en una base datos sqlite3.buku

Además, permite exportar e importar hacia y desde diferentes lugares. Opcionalmente la base se puede cifrar con AES256,  un algoritmo de criptografía asimétrica, el cual usa rondas de substitución y permutación.

Además, con herramientas como xclip o xsel se puede escribir un pequeño script para guardar rápidamente un marcador con buku desde un navegador con interfaz gráfica.

Typora, el mejor editor markdown

Soy un fan de los LML’s (Lightweight Markup Language) ya que permiten crear documentos sin necesidad de recurrir a un procesador de textos. Obviamente no son perfectos. Pero, ¿existe algún software que lo sea? ¿Por otro lado, cuántas funcionalidades usamos de un procesador de textos? Si utilizás:

  • Formatos básicos de tipografías (negrita, cursiva, subrayado, tachado)
  • Inserción básica de imágenes

  • Niveles de encabezados o títulos
  • Tablas sencillas
  • Numeración y viñetas
  • Hipervínculos
  • Notas al pié

probablemente podrías reemplazar el uso de un paquidérmico procesador de textos por un editor de textos más un LML como markdown.

Si esto te parece poco, markdown permite:

  • Resaltar código fuente
  • Formato especial para fórmulas matemáticas:
  • Citas:

    No todo oro reluce, ni toda la gente errante anda perdida

    J. R. R. Tolkien

Por otro lado, aplicando un poco de HTML y CSS podés ampliar notablemente la variedad de formatos.

Hasta ahora había dos maneras de usar markdown:

  • Escribiendo el código LML y posteriormente un compilador de markdown que convierte el archivo a un formato como HTML, PDF, etc.
  • Un editor específico de markdown, es decir, que incluye la capacidad de conversión a otro formato.

Pero Typora introduce una nueva manera, tan útil que uno se pregunta cómo no se le ocurrió a nadie hasta ahora:

  • Con Typora se escribe en markdown y automáticamente se muestra en la misma ventana el código interpretado. Es decir es WYSIWYG.

Esto permite focalizarnos en el texto que escribimos. Digámoslo de una vez: qué es más importante: ¿el contenido, o las decenas de botones y herramientas de un procesador textos?

Typora utiliza electron y está disponible para distintos sistemas operativos:

Typora — a minimal markdown editor, markdown reader.

 

5 ejemplos: Usar la shell sin salir de vim

A veces estamos trabajando con un archivo y queremos ejecutar una serie de comandos, pero sin salir del editor. Veremos varias maneras de hacerlo.

1. El comando Ex shell (sh)

Este comando ((sh)ell)) sirve para abrir una shell sin cerrar el editor.

Importante: Para volver de la shell al editor se puede usar el atajo de teclado o Ctrl-d o bien el comando exit

2. Edición de archivos de la shell

Aquí estamos editando el archivo .bashrc, para que se apliquen los cambios podemos ir a la shell en modo login con:

:set shell=bash\ --login

3. Guardar e ir a la shell

En este ejemplo vemos como se puede aplicar los cambios en un servicio

:w | sh

Aquí la clave es el carácter “|” el cual sirve para ejecutar el comando (sh)ell luego de w.

4. Ejecución de bajo perfil

El comando silent ejecuta el comando de manera silenciosa y el comando redraw! limpia y actualiza la pantalla.

5. Ejecutar el archivo en edición

Al escribir un script en lugar de guardar, salir, ejecutar el script y volver a editarlo, podemos ejecutarlo directamente desde vim:

La clave en cuestión aquí es el carácter ‘%‘ que indica el buffer de la ventana actual.

10 cosas extraordinarias que podés hacer con VIM

Últimamente este editor ha comenzado a tener mala prensa. Se dice que es difícil, anticuado.
En este artículo intentaremos mostrar 10 características distintivas de vim. Muchos creen que VIM es parte de un caprichoso rito de iniciación al mundo UNIX/Linux. Usar VIM no es un hábito snob de algunos geeks, sino una manera de aumentar la productividad.
La cuestión es que algunas distribuciones incluyen de manera predeterminada vi en lugar de VIM. El usuario principiante entonces, al tropeza con aquél, huye hacia otros editores en apariencia más fáciles pero mucho menos potentes. Aquí mostraremos 10 funcionalidades que posee VIM que difícilmente otro editor de texto puede ofrecer, al menos todas juntas.

Cabe aclarar que el siguiente listado es para usaurios que poseen un conocimiento básico de VIM. ¿Todavías no lo tenés? ¡Usá la herramienta vimtutor!

0. Concentrarte en el texto

Muchos editores poseen una gran cantidad de botones y de menús, pero eso muchas veces quita espacio en la pantalla, además de distraernos. VIM está libre de esas intereferencias.
Incluso, tiene plugins y configuraciones para acentuar estas características.12

¿Queremos leer y/o editar archivos de texto o tener que aprendernos para que sirve cada botoncito u opción de cada menú? ¿Qué sentido tiene?

1. Comprobar la ortografía

El comando en modo ex:

:setlocal spell spelllang=es_MX

Establece el idioma que utilizará ViM para la corrección ortográfica. El corrector resaltará las palabras con errores. Al situar el cursos en la palabra mal escrita y usar el comando z= aparecerá una lista de palabras alternativas para reemplazar la incorrecta.

Corrección Ortográfica en VIM

2. Operaciones con bloques

Es común al editar archivos con código fuente encontrarnos con porciones de texto encerrados entre algunos de estos caracteres:

  • <Esto es un Ejemplo>
  • “Esto es un Ejemplo”
  • ‘Esto es un ejemplo’
  • (Esto es un ejemplo)
  • [Esto es un ejemplo]
  • {Esto es un ejemplo}

Para seleccionar el texto encerrado entre signos “<” y “>” podemos usar el siguiente comando:

vi<

Si quisieramos seleccionar el texto incluyendo los signos deberíamos usar:

va<

En castellano una regla mnemotécnica útil es:

  • i: interior
  • a: afuera (inclusive)

Para seleccionar cualquiera de los otros bloques, sencillamente hay que reemplazar el caracter delimitador del bloque.

Esto es muy útil para archivos html, en la siguiente imagen se muestra como se puede seleccionar todo un tag mediante el comando vat:

Por supuesto en lugar del comando inicial v se pueden usar otros tales d, y y c.

Seleccionar bloques en VIM

3. Viajar en el tiempo (controlar ediciones… casi como si fuera GIT)

Este una funcionalidad que ya presenté en un un artículo anterior, pero que tiene sentido mencionar una vez más:

Con Vim se puede volver al estado que tenía el archivo 10 minutos atrás con el comando en el comando en modo ex:

:earlier 10m

Por supuesto, se puede volver al futuro con:

:later 10m

¿Qué pasa si no se pone ‘m’? En eseo caso se retrocede o avanza la cantidad de ediciones especificada.

4. Automatización de operaciones

Hay una manera muy sencilla de repetir operaciones: y es a través del comando .
Dicho comando repite el último comando y repetirlo la cantidad que sea necesaria, sencillamente usando el “punto” las veces que sea necesario. Cuando el comando a repetir es muy complejo es una función de extrema utilidad.

Otra manera de repetir operaciones es anteponiendo un número de veces. Por ejemplo, el comando 10p pega 10 veces el contenido del buffer.

También se pueden usar macros para automatizar tareas utilizando macros:

  1. Prendemos la grabadora con qa
  2. Ejecutamos los comandos deseados
  3. Detenemos la grabadora con q
  4. Reproducimos el comando con @a

Por ejemplo podríamos usarlo para estructurar un documento en markdown de la siguiente manera:

  1. :set nf+=alpha (Para habilitar el incremento de caracteres alfabéticos)
  2. Tipeamos ## A. (sin las comillas)
  3. qa
  4. yyp
  5. Usamos el atajo de teclado Ctrl-a (Para incrementar)
  6. q
  7. Utilizamos 10@a (el número 10 es un ejemplo)

5. Abrir dos archivos al mismo tiempo

Esta función es extremadamente útil. Hay varias maneras de hacerlo, aquí mostraré una manera de hacerlo.

Por ejemplo, si tenemos un archivo y queremos copiar el contenido de otro archivo, debemos ejecutar este comando en modo ex:

:split /etc/squid3/squid.CONF

Desde luego la ruta del archivo es un ejemplo. Luego podemos copiar, cortar, pegar entre las diferentes como es habitual. Lo más importante es saber como pasar entre ventanas: primero se emplea el atajo de comandos Ctrl-w y luego la tecla de la flecha en dirección a la ventana deseada.

Si esto parece complicado, se puede usar incluso el modo ex:

:wincmd j

6. Editar un archivo web al vuelo

Supongamos que estamos copiando código libre de un sitio web a un archivo, podríamos usar el comando siguiente:

vim http://www.fsf.org/index.html

Luego de presionar Enter se descarga el archivo html y se abre una copia en el editor. ¿No es maravilloso?

Editar un archivo descargado al vuelo con VIM

7. Editar un archivo remoto a través de ssh

Este método es múy útil en particular cuando se utilizan claves públicas para autenticar. Hay que hacer así:

vim scp://root@192.168.80.148//etc/squid3/squid.conf

A diferencia del ejemplo anterior este comando edita efectivamente el archivo remoto. Obviamente usa un archivo local de manera temporaria hasta que guardamos los cambios…

8. Explorar archivos

Aquí mediante el comando

:e .

Se abre un explorador de archivos que permite por ejemplo copiar archivos de un directorio a otro.
El procedimiento es tal vez contraintuitivo, pero no por eso es complejo.

  • Se navega como es habitual en gestor de archivos hasta encontrar el directorio de destino. Ubicado allí el cursos se usa el comando mt.

Gestor de Archivos en VIMFIleManagementVIm

  • Luego buscamos el archivo que queremos copiar y usamos los comandos mf y mc.

¡Listo! Se copió el archivo al directorio de destino.

9. Autocompletar texto

Si tenemos que volver a tipear una palabra larga podemos hacerlo rápida y fácilmente con el atajo de teclado Ctrl-p.

Autocompletar palabras en VIM


En el ejemplo siguiente queremos ingresar rápidamente la función isunordered:

VIM tiene además, otras maneras de completar téxto fácilmente mediante el atajo de teclado Ctrl-x. Por ejemplo ingresando luego el atajo de teclado Ctrl-f, podremos escribir rutas de archivos velozmente:

Autocompletar nombres de archivos en VIM

Cabe aclarar que todos estos atajos se usan en modo Insert.

¡Qué lo disfruten!


  1. distraction free vim

  2. Distraction Free Writing with Vim

Defendiendo la disponibilidad de un servicio con iptables

La famosa sigla CID define el trípode en el cual se sustenta la seguridad informática: Confidencialidad, Integridad, Disposnibilidad.

Es decir, al interrumpir la disponibilidad de un servicio se quiebra la seguridad de uno o más servicios.

El famoso ataque de denegación de servicio puede colgar aplicaciones de un servidor o inundarlos de tráfico afectando seriamente el rendimiento. Muchas veces ese tipo de ataque proviene de direcciones IP falsificadas y desde más de un origen. Existen variantes de este tipo de agresiones que pueden incluso aprovechar vulnerabilidades de los dispositivos víctima, de manera tal que los atacantes pueden por ejemplo hacer reemplazar el firmware original por otro malicioso.

El módulo xt_recent

Como vimos, bloquear o limitar el tráfico de una lista estática de direcciones IP no es conveniente. Exige en cambio adoptar una defensa dinámica y proactiva.

El módulo de iptables xt_recent es una de las opciones a las que podemos recurrir en estos casos. Fue creado por Stephen Frost en 2003^1   y lo mantiene actualmente el equipo de iptables.^2

El presente artículo intenta mostrar de manera sencilla y clara el funcionamiento del módulo, no es un curso de iptables ni una receta para diseñar una política de firewall. El propósito es mostrar como el propio kernel posee instrumentos para defenderse contra un (D)DOS.

Como funciona y usos

El modulo xt_recent o más comúnmente conocido recent crea una conjunto de direcciones IPs de acuerdo a ciertos criterios que queramos establecer. Por ejemplo podríamos crear un regla que coincida con paquetes de tipo icmp pertenecientes a conexiones nuevas.

Es cierto, tal vez no podamos hablar estrictamente de conexiones nuevas para este tipo de protocolo. Pero recordemos que iptables es un firewall de estado es decir, no solamente analiza y/o filtra paquetes de manera aislada. Sino que además puede examinar su historial: saber si un paquete pertenece a una conexión nueva (NEW), establecida (ESTABLISHED), relacionada (RELATED) o no válida (INVALID).

Por ejemplo al realizar un echo-request con ping y recibir desde el otro host un echo-reply, iptables, o mejor dicho, netfilter considera que se estableció una conexión.

Si queremos contrarrestar un icmp-flood de manera efectiva lo correcto es limitar las paquetes nuevos.

Reglas sencillas para probarlo

Las siguientes reglas permiten aplicar un límite de un paquete nuevo icmp por minuto (es un ejemplo extremo, pero útil para explicar el funcionamiento del módulo)

iptables -A INPUT -p icmp -m state --state NEW -m recent --update --seconds 60 --hitcount 1 --name icmpflood -j DROP
iptables -A INPUT -p icmp -m state --state NEW -m recent --set --name icmpflood

Como siempre es importante el orden de las reglas, podríamos invertirlas pero en la documentación de primera mano^1 está en ese orden (y las cosas cambiarían, podés probarlo vos el resultado).

Pero veamos las cosas tal como están. Supongamos que no han llegado paquetes nuevos icmp: Al arribar uno, no coincidirá con la primer regla. Explicaremos la razón:

El parámetro --seconds-- indica el intervalo de tiempo que examinaremos, mientras que --hitcount evalúa la cantidad de paquetes de este tipo desde la misma dirección. Es importante entender que esta regla no incrementa el contador. Solamente examina cantidad de paquetes por unidad de tiempo. Como hasta ahora el contador está en 0, el paquete podrá ingresar (asumimos que la política predeterminada es ACCEPT, lo cual puede – en principio – ser inseguro, pero nuestro propósito es explicar el funcionamiento de recent, de manera que el lector está advertido). Insistimos: esta regla NO penaliza, es decir no incrementa el contador. ¿Quedó claro?

Vayamos a la segunda regla: esta regla crea un conjunto llamado icmpflood e incrementa el contador para los paquetes que cumplan con los requisitos estipulados, es decir: con protocolo icmp y estado NEW. De manera que al llegar el primer paquete se agrega la dirección IP al set icmpflood y el número de hits es ahora 1.

Recién al llegar el segundo paquete en menos de 60 segundos se habrán cumplidos los requisitos de la primer regla y por lo tanto el paquete será descartado.

Método sencillo para testear las reglas

Lo podemos probar sencillamente con los siguientes comandos desde otro host:

pingwait(){ ping -q -c1 $1 & sleep 31; }
IP=192.168.80.148
pingwait $IP; pingwait $IP; ping -q -c1 192.168.80.148

Es decir lo que hacemos es enviar dos paquetes nuevos icmp cada 31 segundos.

El resultado en el host de destino es:

Every 2,0s: iptables -L INPUT -vn  

Chain INPUT (policy ACCEPT 63 packets, 3612 bytes)
 pkts bytes target     prot opt in     out     source               destination
    2   168 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: UPDATE seconds:
 60 hit_count: 1 name: icmpflood side: source mask: 255.255.255.255
    1    84            icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: SET name: icmpflood side: source mask: 255.255.255.255

Explicación amigable de rcheck y update

No explicamos en absoluto el significado de UPDATE (–update) hasta ahora y la diferencia con CHECK (–rcheck). No es sorpresa que la mejor explicación esté en la documentación original. Muchos de los sitios que intentan explicarlo en mi modesta opinión no lo hacen de la manera más clara. Así que trataré de hacerme entender, ya que son dos parámetros claves. Pero antes de hacerlo y sin querer eludir la explicación, mostraré el resultado al cambiar UPDATE por CHECK:

iptables -F && iptables -X && iptables -Z
iptables -A INPUT -p icmp -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 1 --name icmpflood -j DROP
iptables -A INPUT -p icmp -m state --state NEW -m recent --set --name icmpflood
Every 2,0s: iptables -L INPUT -vn                                                                       Thu Jan  7 16:49:41 2016

Chain INPUT (policy ACCEPT 57 packets, 3250 bytes)
 pkts bytes target     prot opt in     out     source               destination
    1    84 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: CHECK seconds:
60 hit_count: 1 name: icmpflood side: source mask: 255.255.255.255
    2   168            icmp --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: SET name: icmpf
lood side: source mask: 255.255.255.255

Supongamos que tenés una bolsa con 10 caramelos y un nene te pide que se los des. Aceptás con una condición, solamente podrá comer 2 por hora. Entonces, podrías adoptar dos políticas con el pequeño:

Laxa (–rcheck)

  • Hora 15:00 Viene el nene por primera vez y te pide 2 caramelos. Le das un caramelo.
  • Hora 15:15: ¡Regresa el niño en busca de más caramelos! Está ok, le regalás el dulce, pero le decís que es el último durante esa hora.
  • Hora 15:30: Otra vez el simpático nene te pido caramelos, le explicás que ya comió los dos caramelos que corresponden a esa hora, recién a las 16:00 se lo darás.
  • Hora 16:00: Ahora sí tal lo prometido le podrás dar 1 o 2 caramelos durante las 16:00 hasta las 16:59.

Rígida (–update)

  • Hora 15:00 Viene el nene por primera vez y te pide 2 caramelos. Le das un caramelo.
  • Hora 15:15: ¡Regresa el niño en busca de más caramelos! Está ok, le regalás el dulce, pero le decís que es el último durante esa hora.
  • Hora 15:30: Otra vez el simpático nene te pido caramelos, le explicás que ya comió los dos caramelos que corresponden a esa hora… Pero que durante una hora a partir de ahora no le podrás dar más caramelos.
  • Hora 15:45: El chico insiste quiere más caramelos. Como disciplina le decís que por no esperás volvés a extender el tiempo de espera. De manera que tendrá que esperar hasta las 16.45 para recibir otro caramelo.
  • Hora 16:00 El pobre nene insiste, entonces extendés la penalidad una hora más. Y el nino recién ahí comprende la indicación y espera una hora.
  • Hora 17:00: Ahora sí tal lo prometido le podrás dar 1 o 2 caramelos durante los siguientes 60 minutos.

Así que esas son las diferencias entre --rcheck, --update, cuanto menos respete el atacante el tiempo estipulado en --seconds peor será le penalidad. En el ejemplo que estuvimos viendo --update significa que el otro host deberá esperar sí o sí 1 minuto entre ping y ping. En cambio --rcheck es más permisivo, por cada nuevo minuto nuevo que comience podrá enviar la cantidad estipulada en --hitcounts que en nuestro ejemplo fue 1 paquete.

Archivos de listas en /proc/net/xt_recent

root@raspberrypi:~#  cat  /proc/net/xt_recent/icmpflood src=192.168.80.250 ttl: 64 last_seen: 29694939 oldest_pkt: 3 29688739, 29691839, 29694939

Hay un archivo por lista (set). Vemos en el archivo /proc/net/xt_recent/icmpflood la dirección de origen del paquete y además la última vez que fue vista usando la unidad de tiempo jiffies.

Parámetros del kernel

Además se le pueden pasar parámetros al módulo

ip_list_tot: Número de direcciones IPs que puede recordar por lista
ip_pkt_list_tot: Número de paquetes que puede recordar por IP (el máximo es 255)

Conclusión

Como vemos si bien existen otros métodos para mitigar un DDOS o DOS, este tiene la ventaja de usar directamente netfilter, sin la necesidad de instalar una herramienta adicional.

 

Instalar Linux desde un archivo ISO

En el artículo anterior habíamos visto el potencial de la shell de GRUB 2. Allí habíamos visto que podíamos arrancar directamente desde una imagen ISO sin necesidad de tener que grabarlo en un disco óptico ni copiarlo a una unidad USB.

Ahora bien, ¿podríamos además instalar un sistema operativo utilizando ese método? La respuesta es sí. En este caso puntual veremos como instalar Fedora 23.

Aquí, tendremos que tener en cuenta los dos software involucrados principalmente para poder realizar esta tarea. Estos programas son GRUB 2 (naturalmente) y dracut.

Recordemos que en el momento del arranque se utiliza un sistema de archivos temporal en memoria hasta que se pueda realizar el montaje del definitivo sistema de archivos raiz.

dracut es tanto una infraestructura de initramfs manejada por eventos como así también una herramienta que se usa para crear una imagen de disco en memoria.  El comando dracut copiar herramientas y archivos de un sistema instalado y lo combina con el framework dracut.

Estos archivos se pueden ver en fedora en el directorio /usr/lib/dracut/modules.d:

 


[sergio@hope ~]$ ls /usr/lib/dracut/modules.d
00bash               30convertfs  90dm                      90qemu-net    95fstab-sys     95zfcp            99base
00systemd            40network    90dmraid                  91crypt-gpg   95iscsi         95zfcp_rules      99fs-lib
00systemd-bootchart  45ifcfg      90dmsquash-live           91crypt-loop  95nbd           95znet            99img-lib
01systemd-initrd     45url-lib    90kernel-modules          95cifs        95nfs           97biosdevname     99kdumpbase
02systemd-networkd   50drm        90kernel-network-modules  95dasd        95resume        98dracut-systemd  99shutdown
03modsign            50plymouth   90livenet                 95dasd_mod    95rootfs-block  98ecryptfs        99uefi-lib
03rescue             80cms        90lvm                     95dasd_rules  95ssh-client    98pollcdrom
04watchdog           90bcache     90mdraid                  95debug       95terminfo      98selinux
05busybox            90btrfs      90multipath               95fcoe        95udev-rules    98syslog
10i18n               90crypt      90qemu                    95fcoe-uefi   95virtfs        98usrmount

Por lo tanto aquí la clave es pasar los parámetros del kernel y opciones para dracut correctas. Y para agregar la entrada al menú de grub utilizamos el archivo /etc/grub.d/40_custom.

 exec tail -n +3 $0
 # This file provides an easy way to add custom menu entries. Simply type the
 # menu entries you want to add after this comment. Be careful not to change
 # the 'exec tail' line above.

menuentry "Live Fedora 23" --class fedora {
 set isofile="/Fedora-Live-KDE-x86_64-23-10.iso"
 loopback loop (hd0,gpt8)$isofile
 linuxefi (loop)/isolinux/vmlinuz0 iso-scan/filename=${isofile} root=live:CDLABEL=Fedora-Live-KDE-x86_64-23-10 rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0
 initrdefi (loop)/isolinux/initrd0.img
 }

Aquí los comandos y opciones claves son respectivamente loopback e iso-scan.

El comando loopback sirve para especificar la ruta a un archivo ISO para que sea tomado como un dispositivo de bloques. Mientras tanto el parámetro iso-scan sirve para montar el dispositivo de loopback y pasarle los parámetros de kernel y dracut apropiadas.

¿Cómo sabemos las opciones y parámetros correctos? Las podemos averiguar montando el archivo ISO e inspeccionando el archivo isolinux.cfg:


[root@hope sergio]# mount -o loop /usr/Fedora-Live-KDE-x86_64-23-10.iso /media
mount: /dev/loop0 está protegido contra escritura; se monta como sólo lectura
[root@hope sergio]# grep -m1 append  /media/isolinux/isolinux.cfg 
  append initrd=initrd0.img root=live:CDLABEL=Fedora-Live-KDE-x86_64-23-10 rootfstype=auto ro rd.live.image quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0

Sencillamente debemos copiar lo que está a continuación de append initrd=initrd0.img.

Además, se pueden apreciar los comandos linuxefi e initrdefi que son equivalente de manera respectiva a las ordenes linux e initrd al utilizar un sistema con UEFI.

Finalmente, debemos ejecutar el comando para generar el nuevo archivo de GRUB 2:

[root@hope sergio]# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

Reiniciamos, elegimos la opción Live Fedora 23 y luego podremos instalar el sistema operativo.

Instalar desde un archivo ISO

La partición importa

La partición en la que está ubicado el archivo ISO importa. Existe un bug en el módulo de python para la configuración de almacenamiento del sistema llamado blivet que impide la instalación del sistema operativo si la ISO está en alguna partición marcada en el editor de particiones, más allá de que esta se formatee o no. Como solución provisoria, se puede emplear una partición sin que el instalador la tenga en cuenta. De hecho, hice eso mismo. Luego, posterior a la instalación usé dicha partición para el directorio /usr, usando rysnc, editando el archivo /etc/fstab y borrando el /usr original.

Conclusión

Una vez más, podemos apreciar el potencial de GRUB 2 y como podemos prescindir de otros medios para instalar sistemas operativos. De hecho, dado el gran tamaño de los discos en la actualidad, podríamos tener una partición específicamente para tener ISOS.

 

La poderosa shell de GRUB 2

En el artículo anterior hemos visto que la línea de comandos de GRUB nos permitía reparar el cargador de arranque sin necesidad de recurrir a un cargador de arranque.

GRUB2 como es de suponer también permite hacerlo:

grub> set root=(hd0,1)
grub> linux /vmlinuz-3.16.0 root=/dev/mapper/centos-root ro
grub> initrd /initramfs-3.16.0.img
grub> boot

Como vemos cambian algunos comandos, sintaxis y la nomenclatura de particiones pero la idea es la misma.

Desde ya contamos con la tecla TAB​ para autocompletar rutas de archivo y el comando cat:

Comando cat en GRUB2
Arrancar directo desde un archivo ISO

Bajamos una distro y no queremos ni tenemos tiempo para grabarla en un CD/DVD. Perfecto, GRUB2 en la mayoría de los casos puede arrancar también una imagen ISO:

 

 

grub> set isofile=/TinyCore.iso 
grub> loopback loop (hd0,1)/$isofile vmlinuz 
grub> linux (loop)/boot/vmlinuz cde loglevel=3 
grub> initrd (loop)/boot/core.gz

Tener acceso a un archivo de un LVM

Sí, estimados, GRUB2 puede también leer un volumen lógico, ¿Cómo? Así:

LVM y GRUB2

Algo más

¿Más? Sí, mas todavía, por ejemplo listar dispositivos en el bus PCI:

Comando lspci en GRUB2

Como se puede apreciar GRUB es bastante más que un boot loader y su shell lo suficientemente potente como para prescindir de un LiveCD (al menos en soporte físico) en más de una ocasión.

Información complementaria

Reparar GRUB Legacy sin LiveCD

Se borró el boot loader del MBR, o se editó mal el MBR se puede en muchos casos reparar GRUB y/o arrancar desde la la misma shell del boot loader. ¡Sin necesidad de ningún LiveCD!

Primero vamos a ver como se hace con GRUB Legacy (distribuciones como CentOS 5 y 6 están hasta la fecha soportadas y lo usan).
En el arranque grub debería permitirnos ingresar a la shell de GRUB presionando la tecla, entonces veremos el prompt correspondiente:

grub>

Una de las cosas sumamente útiles que podemos hacer allí es buscar los archivos de arranque, por ejemplo, las imágenes compiladas del kernel, initramdisks, etc.
El comándo mágico es find:​

grub> find /

Si /boot está en una partición separada del directorio raíz, lo hacemos como se muestra arriba, sino la ruta en ese caso sería /boot. Cualquier sea el caso, luego presionamos la tecla TAB

Entonces veremos el contenido del directorio /boot:

El comando find en la shell e grub

Ok, pero sigamos con tema que nos convoca, ahora vamos a definir la raíz de grub:

 

grub> root (hd0,0)

 

Le decimos donde están el kernel y el initrd:

grub> kernel /vmlinuz-2.6.32-504.el.x86_64 ro root=/dev/mapper/vg_centos66-lv_root
grub> kernel /initramfs-2.6.32-504.el.x86_64

No es necesario saber los nombres completos de los archivos, recordemos que la tecla TAB​ es nuestra amiga.

Además, contamos con el fabuloso comando (sí, ¿No es fabuloso contar con esta herramienta en este escenario?) cat para poder consultar el archivo de configuración de grub para ver el dispositivo que está montado sobre el directorio raíz.

Listo, luego ejecutamos el comando boot:

grub> boot

Y podremos loguearnos en el sistema e instalarlo mediante el comandogrub-install

.

​:“`

Usando mutt con Vmail

VMail es una alternativa a GMail. Este servicio de webmail está hosteado en Francia.

El servicio se autodefine como:

The simple and secure email service which respects your privacy.

Su política de privacidad1 es la siguiente (traducción no oficial):

  • Registro de cuenta sin proporcionar ninguna información personal.
  • Sin publicidad.
  • Eliminación de cuenta.
  • Almacenamiento de datos cifrado (cifrado de disco LUKS)
  • Logs mínimos de server (cumplen con la European Data Retention Directive2)
  • Se eliminan de los encabezados de los emails las direcciones IP y los agentes de usuario
  • No se usan software de código fuente cerrado, los servicios de terceros o librerías hosteadas.

El software utilizado es roundcube, el framework web de PHP Symphony2 y Arch Linux.

Además, tiene soporte para usar IMAP y SMTP con SSL/TLS. De manera que lo podemos usar con un cliente de correo. Y si bien Thunderbird es estupendo, ¿por qué no utilizarlo con mutt?

Mutt es un extraordinario cliente de correo que no necesita un servidor de ventanas (una interfaz gráfica) para poder usarlo y es ideal para entornos minimalistas.

Debajo incluyo el archivo de configuración correspondiente:

~# cat .muttrc
set folder="imaps://vmail.me/"
set locale="es_AR.UTF-8"
set imap_user=username@vmail.me
set imap_pass=tupassword
set spoolfile="imaps://$imap_user:$imap_pass@vmail.me/INBOX"
#mailboxes =+INBOX
set header_cache=~/.cache/mutt
set message_cachedir="~/.cache/mutt"
set postponed="+INBOX.Drafts"
unset imap_passive
set imap_keepalive=300
set mail_check=120
set my_pass=$imap_pass
set realname='Nombre Apellido'
set from=username@vmail.me
set use_from=yes
set smtp_url=smtps://$imap_user:$imap_pass@vmail.me:465
set editor=vim
set beep_new=yes
bind index <f5> imap-fetch-mail
set sort = reverse-date-received
set net_inc=5
set record = "+INBOX.Sent"

¡Qué lo disfruten!


  1. https://www.vmail.me/en/privacy
  2. Artículo en Wikipedia: http://bit.ly/1EbKlVv