Author Archives: alfredo

ModSecurity con Nginx en Buster

Tras pasarlo regular para poner a marchar un Nginx como proxy inverso con ModSecurity, he pensado que sería buena idea volcar en alguna parte mis notas para ahorrar quebraderos de cabeza a otros sufridos informáticos.

Buster lleva la librería ModSecurity 3 ya empaquetada. No hay más que instalarla con apt.

Lo que da un poco de problema es compilar el módulo de nginx. Esto, por ahora, hay que hacerlo a mano.

Primero, instalar nginx con apt.

Luego, bajar el fuente de la versión exacta. En el momento de escribir esto:

dpkg -l nginx
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-============-============-==========================================
ii nginx 1.14.2-2 all small, powerful, scalable web/proxy server

Por tanto:

wget -O - http://nginx.org/download/nginx-1.14.2.tar.gz | tar xzf -

También necesitamos el conector de ModSecurity con nginx:

git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Ahora, ojo a esto. Aparte de build-essential, hacen falta otras cosas. La más enrevesada es libpcre3-dev. Sin esto, no compila el módulo de nginx. Pero es que además hay que configurar el conector para que la use. Es decir, ya en el directorio del fuente de nginx (nginx-1.14.2 en este caso):

./configure --with-compat --add-dynamic-module=../ModSecurity-nginx --without-http_rewrite_module --without-http_gzip_module --with-pcre

Hecho esto, ya no hay más que hacer make.

Otra cosa que despista un poco es dónde pone Debian las cosas. El módulo compilado lo podemos encontrar en objs/ngx_http_modsecurity_module.so y casi cualquier guía que encontremos por ahí dice de ponerlo en /etc/nginx/modules. Pero nop, eso no es el estilo Debian. Para hacerlo al estilo Debian, hay que soltarlo en /usr/lib/nginx/modules/ y seguidamente crear la configuración que lo carga. Verbigracia:

echo "load_module modules/ngx_http_modsecurity_module.so;" > /tmp/mod-security.conf && sudo mv /tmp/mod-security.conf /etc/nginx/modules-available/

cd /etc/nginx/modules-enabled/

sudo ln -s ../modules-available/mod-security.conf 50-mod-security.conf

sudo service nginx restart

Y nuestros esfuerzos se verán recompensados con un:

nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_modsecurity_module.so" is not binary compatible in /etc/nginx/modules-enabled/50-mod-security.conf:1

Mierda.

Total. Que vamos a ver cómo está construído el nginx del paquete Debian:

nginx -V

Esto suelta el chorizo que en su día le pasaron al nginx al compilarlo para empaquetarlo. Y nos dice que:

configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-sWHVb6/nginx-1.14.2=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-sWHVb6/nginx-1.14.2/debian/modules/http-auth-pam --add-dynamic-module=/build/nginx-sWHVb6/nginx-1.14.2/debian/modules/http-dav-ext --add-dynamic-module=/build/nginx-sWHVb6/nginx-1.14.2/debian/modules/http-echo --add-dynamic-module=/build/nginx-sWHVb6/nginx-1.14.2/debian/modules/http-upstream-fair --add-dynamic-module=/build/nginx-sWHVb6/nginx-1.14.2/debian/modules/http-subs-filter

Vale

Pues nada, paciencia y vamos a ver.

make clean

./configure --add-dynamic-module=../ModSecurity-nginx --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-sWHVb6/nginx-1.14.2=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module

make

sudo cp objs/ngx_http_modsecurity_module.so /usr/lib/nginx/modules/ngx_http_modsecurity_module.so

sudo service nginx start

Los otros –add-dynamic-module se pueden omitir. Y ya estamos listos.

Configurar un proxy inverso con ModSecurity es otra historia y debe ser contada en otra ocasión.

Debian live a medida

En Github se pueden encontrar excelentes instrucciones para instalar una Debian Stretch con ZFS en la raíz. ZFS no está disponible directa y cómodamente en el instalador de Debian porque las licencias de Linux y de ZFS no son compatibles, por lo que es necesario <suspiro>hacerlo a mano</suspiro>.

En fin. La forma más normal, como se puede leer, es arrancar con una Debian «live» y seguidamente hacer un montón de cosas a mano. Esto es muy instructivo, pero cuando a uno le esperan una pila de hipervisores, que pesan más que uno y hasta algunos opinan que valen más, en todos los cuales hay que instalar una ZFS en raíz… Es de recibo buscar un método algo más automático.

El primer paso es automatizar un poquejo las acciones con un script en bash. Esto es bastante agradecido ya; no hay más que copiar y pegar, y la instalación se hace sola (más o menos).

Pero arrancar con una Debian Live tiene sus cosillas, como que hay que instalar una tonelada de software todas y cada una de las veces. Entre otras cosas, el zfs va en dkms y depende de un montón de cosas.

Así que, redondeando, decidí hacerme una Debian Live a medida. Esto no es tan difícil, especialmente si alguien lo ha hecho antes y ha vivido para documentarlo, como por ejemplo ha hecho Will Haley con este excelente artículo. Partiendo del mismo, he hecho unas pocas adaptaciones y esto es lo que me funciona, para hacer una ISO de Debian Stretch (live) especialmente para instalar Debian con ZFS en raíz, utilizando una Debian Stretch.

En el artículo de Will Haley también explica cómo generar un pincho USB. Pero como la ISO me soluciona la papeleta (porque uso iDRAC, IPMIs, iLOs y otras cosas que comienzan con i), aquí me he quedado.

La cosa empieza instalando en la Debian en que vayamos a trabajar lo necesario:

sudo apt install debootstrap squashfs-tools xorriso grub-pc-bin grub-efi-amd64-bin mtools

Nos creamos un directorio (voy a usar el mismo nombre que Will Haley para no liarnos) y algunos subdirectorios que usaremos más adelante:

mkdir -p LIVE_BOOT/{scratch,image/live}

Nos montamos una Debian básica en ese directorio:

sudo debootstrap --arch=amd64 --variant=minbase stretch LIVE_BOOT/chroot http://deb.debian.org/debian/

En lugar de http://deb.debian.org/debian, podemos usar nuestro mirror favorito si tenemos uno. Igualmente, la arquitectura puede ser i386 o lo que necesitemos.

Nos vamos al chroot:

sudo chroot LIVE_BOOT/chroot

Elegimos un nombre para nuestra Debian «viva» y lo ponemos:

echo "viva" > /etc/hostname
echo "127.0.1.1 viva" >> /etc/hosts

Le instalamos un kernel y lo necesario para el arranque:

apt install --no-install-recommends linux-image-amd64 live-boot systemd-sysv

Añadimos a la masa los paquetes que queramos tener disponibles. Varios de los siguientes son prácticamente una necesidad para poder tener red y esas cosillas:

sudo apt install curl openssh-client openssh-server iproute2 iputils-ping less sudo emacs-nox

Y si queremos usar esta imagen para instalar un ZFS en raíz, podemos ir metiendo algunos paquetes que necesitaremos. Desafortunadamente, zfs-dkms no se puede compilar en un chroot (ni idea de por qué), pero al menos se puede dejar instalado:

sudo apt install debootstrap gdisk dpkg-dev linux-headers-amd64
sudo apt install zfs-dkms

Limpiamos:

sudo apt clean

Creamos un usuario si nos apetece y le damos sudo. O bien simplemente ponemos una clave a root:

sudo useradd -m -s /bin/bash debian
sudo passwd debian
sudo passwd root
sudo visudo

Y nos salimos del chroot

exit

Ya tenemos nuestro entorno listo; ahora hacemos con él un sistema de ficheros:

sudo mksquashfs LIVE_BOOT/chroot LIVE_BOOT/image/live/filesystem.squashfs -e boot

Copiamos el kernel y el sistema de ficheros al directorio donde guardamos lo que irá en la imagen:

sudo cp LIVE_BOOT/chroot/boot/vmlinuz-* LIVE_BOOT/image/vmlinuz
sudo cp LIVE_BOOT/chroot/boot/initrd.img-* LIVE_BOOT/image/initrd

Ahora vamos a crear la configuración de GrUB. El comando search lo que hace es buscar un sistema de ficheros que contenga el fichero /DEBIAN_CUSTOM que vamos a crear seguidamente. Lo podríamos haber llamado /Susana o cualquier otra cosa. El caso es que el sistema de ficheros que pesque con ese fichero creado es el que va a llamar raíz:

cat <<'EOF' > LIVE_BOOT/scratch/grub.cfg
search --set=root --file /DEBIAN_CUSTOM
insmod all_video
set default="0"
set timeout=5
menuentry "Debian Live" {
linux /vmlinuz boot=live quiet nomodeset
initrd /initrd
}
EOF

Creamos el fichero prometido en su sitio:

touch LIVE_BOOT/image/DEBIAN_CUSTOM

Creamos la imagen UEFI con GrUB:

sudo grub-mkstandalone --format=x86_64-efi --output=LIVE_BOOT/scratch/bootx64.efi --locales="" --fonts="" "boot/grub/grub.cfg=LIVE_BOOT/scratch/grub.cfg"

Creamos la imagen de arranque UEFI, de 16 bits de toda la vida (al menos de la vida del PC):

cd LIVE_BOOT/scratch
dd if=/dev/zero of=efiboot.img bs=1M count=10
mkfs.vfat efiboot.img
mmd -i efiboot.img efi efi/boot
mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
cd ../..

Y una imagen de arranque para BIOS:

sudo grub-mkstandalone --format=i386-pc --output=LIVE_BOOT/scratch/core.img --install-modules="linux normal iso9660 biosdisk memdisk search tar ls" --modules="linux normal iso9660 biosdisk search" --locales="" --fonts=""  "boot/grub/grub.cfg=LIVE_BOOT/scratch/grub.cfg"

Concatenamos la imagen de arranque de CD con el sistema de ficheros que hemos creado:

cat /usr/lib/grub/i386-pc/cdboot.img LIVE_BOOT/scratch/core.img > /tmp/bios.img
sudo mv /tmp/bios.img LIVE_BOOT/scratch/bios.img

Y por fin, crear la ISO:

sudo xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames -volid "DEBIAN_CUSTOM" -eltorito-boot boot/grub/bios.img -no-emul-boot         -boot-load-size 4 -boot-info-table --eltorito-catalog boot/grub/boot.cat --grub2-boot-info --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img -eltorito-alt-boot -e EFI/efiboot.img -no-emul-boot -append_partition 2 0xef ${HOME}/LIVE_BOOT/scratch/efiboot.img     -output "${HOME}/LIVE_BOOT/debian-custom.iso" -graft-points         "${HOME}/LIVE_BOOT/image"  /boot/grub/bios.img=$HOME/LIVE_BOOT/scratch/bios.img  /EFI/efiboot.img=$HOME/LIVE_BOOT/scratch/efiboot.img

Listo para usar. A pasarlo pipa.

Los ventiladores de los Mikrotik CCR1036

El sol lucía a mediados de Agosto en la calle cuando, en el CPD, un CCR dijo que uno de sus ventiladores había dejado de girar.

El ventilador en cuestión pertenecía a un Mikrotik CCR 1036 (si, uno de esos a los que ya a estas alturas he hecho mil perrerías, como meterles doble fuente o cambiar condensadores de estabilización de los chips Ethernet).

Algo fastidiado, porque este tipo de equipos generalmente es un tanto complicado desmontarlos estando en producción, me puse a investigar.

Por un lado, encontré un documento PDF titulado «TroubleShooting for CCR1036/CCR1016«. No estoy seguro de su autoría; los metadatos dicen que fue creado con la aplicación Draw de OpenOffice 3.4.1 el 6 de Diciembre de 2013, pero no tienen nada en el campo de autor. En él, se dice que si el ventilador no va, se verifique el transistor Q133. Q133 es un transistor SMD minúsculo, por lo que empecé a rezar a Santa Tecla para que lo roto fuera el ventilador, y no Q133.

Total, que cogí un ejemplar del taller y me miré los ventiladores. Los fabrica Chiefly Choice, su modelo CC 4028B12M. En el momento de escribir este artículo, aquí está su hoja de características. En resumen, es un ventilador de rodamientos de bolas, de 40x40x28 mm; a cambio de 190 mA a 12V, gira a 7000 rpm, moviendo casi 13 CFM (368 l/m), emitiendo un ruido de 33 dBA. O eso dice el fabricante.

En Digi-Key encontré casi 100 posibles sustitutos, muchos de ellos con ventaja. Y ya tenía el dedo en la lista de la compra, cuando el router dijo que el otro ventilador se había parado.

Dos ventiladores de los dos que tiene el chisme parados dan para acojonar al más pintado, porque ya sabemos lo que sigue a continuación: La temperatura empieza a subir rápidamente, y el trasto empieza a rearrancar, lo cual lo enfría un poco, pero en seguida se vuelve a calentar y así se queda, en un bucle sin fin de autodestrucción.

Pero sucedía algo extraño. La temperatura no subía. El trasto seguía clavado en sus 50 grados en placa (60 en el procesador) y diciendo que tenía todos sus ventiladores parados.

Más moscas que las que hay en un laboratorio de teleportación, nos acercamos al centro de datos a meter una brida por la parte trasera del chisme, y… ¡Ñiooooook! Aquello estaba girando, como siempre desde que se enchufó la última vez y se empezó a calentar.

Parece improbable que los dos sensores hayan fallado a la vez, por lo que me inclino a pensar en un fallo de RouterOS. Que he buscado, pero no encontrado; así que lo actualizaremos y ya veremos lo que nos depara el futuro.

Para la posteridad, aquí queda este testimonio de que (a) los CCR1036, al menos una vez, indicaron que estaban sin ventilación no siendo cierto; y (b) las características y referencia de los ventiladores, y posibles sustitutos.

La consola

Desde que Microsoft hiciera su famoso salvapantallas de las tuberías para los Windows NT, en la época de las pantallas de tubos de rayos, ha llovido como para aguar el whisky de todas generaciones que quedan hasta que se nos meriende el sol.

En nuestros tiempos de servidores lindamente apilados en armarios en centros de datos, y sobre todo, de servidores virtuales, los protectores de pantalla en los servidores cumplen las siguientes funciones:

  • Estorbar cuando queremos ver la consola
  • Tener corriendo software innecesario, por lo que son superficie atacable
  • Consumir recursos

Sin embargo, curiosamente, casi todos los proveedores de sistemas operativos (distribuciones GNU/Linux, Windows, etc) parecen seguir encantados con los salvapantallas. En mi estimadísima Debian, se sigue instalando por defecto console-setup, un paquete que solamente es útil si se corre X; y el kernel sigue viniendo por defecto con salvapantallas para la consola.
Como todo esto me parece un derroche, tengo por hábito (ansible mediante o a mano, según) especificar en la línea de opciones del kernel lo siguiente:

consoleblank=0 gfxpayload=text nomodeset nofb

La forma más cómoda de hacerlo es dpkg-reconfigure grub-pc.

Con esto, lo que hacemos es quitar de en medio el framebuffer y dejar la consola en riguroso texto de 80×25 que, aunque no queda mono para hacer una serie de televisión, es lo que normalmente se necesita; y quitamos de en medio el que la pantalla (que no existe) se quede en blanco para «protegerla». Al abrir la consola virtual de este servidor, veremos en seguida lo que está contando (si es que se cuenta algo), y evitamos la habitual incómoda minucia de mandarle una tecla para que lo haga.

 

BFD: Mola, a no ser que a alguien se le ocurra que mola demasiado

BFD (RFC 5880 y ss) es un protocolo independiente del enlace para detectar rápidamente fallos en los mismos. La teoría de funcionamiento es similar a la de un «hello» como los que se usan en OSPF, BGP, etc: Ambos lados esperan recibir periódicamente paquetes BFD del otro y, de no recibirlos, suponen fallecido el enlace y hacen lo que sea que resulte apropiado.

Además del protocolo base, RFC 5881 define BFD sobre IPv4 e IPv6, y RFC 5882 define algunos casos de uso y detalles para implementarlo.

La cosa no está nada mal pensada, excepto por el hecho de que no está definido en ninguna parte si BFD, en los equipos e interfaces que lo pueden llevar, debe estar activado salvo configuración en contra, o no.

Cisco, en su prudente sabiduría, implementa BFD. Si se quiere utilizar, hay que activarlo explícitamente. Algo muy de agradecer, a diferencia de la florida historia del mal parido «Smart Install». Que de smart, la verdad, tiene bien poco.

Mikrotik, por su parte, quizá pensando que esto de BFD mola, lo activa por defecto… Pero ojo, lo hace en los interfaces en que se configura OSPF. Aguanta y tira. O sea, que uno todo confiado añade un interface para hablar OSPF con un Cisco, y comprueba sorprendido cómo la adyacencia se cae y reestablece cada pocos minutos. Carallo, ¿y eso?

Pues BFD. Como el Mikrotik lo activa por defecto en los puertos que hablan OSPF, asume que el otro lado también va a tenerlo activado. Ah, que el otro lado es un Cisco y no… Pues nada, cada minuto el BFD decide que el enlace se ha caído, y por tanto lo sensato es volver a negociar.

BFD está bien, pero en un enlace Ethernet a giga o superior, con todas sus garantías, no parece que añada mucho y no deja de ser un servicio que puede tener problemas. Así que, en general, opto por

/routing/ospf/interface set use-bfd=no numbers=x

Y como se decía antes: Muerto el perro, se acabó la rabia.

Mikrotik y el puerto 2000

A veces, uno tiene la sensación de ser el último en enterarse.
Así me ha sucedido con el peculiar uso, por parte de Mikrotik, del puerto 2000 (que IANA asignó al protocolo SCCP de Cisco en el ya lejano año 2003).
Ellos lo usan para una herramienta llamada bandwidth-server, cuya utilidad en este mundo es probar el ancho de banda de una red conectada a un Mikrotik. Y lo mejor de todo: Está disponible tanto por TCP, como por UDP.
¿Soy el último en pensar que esto es una mala idea, dicho con toda la diplomacia de que soy capaz?
En fin. A lo que voy:
/tool bandwidth-server set enabled=no
Y se acabó el problema. Problema que no debería existir, para empezar a hablar.
Así que voy a añadir esta línea a mi receta de Ansible para Mikrotiks, junto con deshabilitar la pila de servicios que vienen por defecto habilitados.

Mac OS X no se deja actualizar

Sucede en las peores familias: Uno se apunta a las betas de Mac OS X en un momento de locura y desenfreno. Prueba antes que nadie, un tanto kamikazemente, cosas como APFS. Y un buen día, encuentra que no hay cosas aparentemente tan guays que justifiquen seguir corriendo betas. Así que saca el ordenador de las betas. Fácil, ¿no?.

Pues no.

Por algún motivo que no he llegado a comprender del todo, desde que saqué mi ordenador de las betas de Apple no actualiza bien. App Store avisa de que hay una actualización, la descarga, rearranca, hace como que la instala… Y al volver al escritorio, está la que estaba antes.

Mientras encuentro el tiempo (léase «ganas») de investigar el motivo último de este comportamiento, he encontrado una forma de instalar las actualizaciones a mano. Es poco trabajo, pero me ha costado un poco reunir la información, así que aquí queda.

Lo primero es hacernos con el «Combo update» en la página de descargas de Apple. Cuando acaba de salir una versión nueva, suele ser lo primero que sale.

Segundo, arrancar el Mac en modo recuperación (Cmd-R mientras hace clonnnng). Este es un modo mínimo que corre separadamente del sistema operativo principal, y por tanto no se ve afectado por las veleidades de éste.

Tercero, ya con el Mac arrancado en modo recuperación, tirar de la Utilidad de Discos y montar:

  1. Nuestro volumen principal. Sale en la barra lateral, no hay más que marcarlo y puchar el botón «Montar». Habrá que poner la clave si es encriptado.
  2. La imagen de disco de la actualización: Archivo, Abrir imagen de disco, buscarla y listo.

Armados con todo esto, ya podemos burguesamente abrir un terminal y, con la línea de comandos:

installer -pkg combo.pkg -target nuestrodisco

Por ejemplo:

installer -pkg /Volumes/macOS\ High\ Sierra\ 10.13.4\ Update/macOSUpdCombo10.13.4.pkg -target /Volumes/Macintosh\ HD

Y cuando diga que está listo:

reboot

Y el universo volverá a estar en equilibrio… Hasta la próxima.

 

Cuando zfs se hace el pool un lío porque hemos hecho demasiados experimentos

Instalar una Debian 9 con zfs en la raíz es, si no rápido, al menos relativamente indoloro gracias a la guía que mantiene zfsonlinux en Github.

Aunque esa guía es enormemente concienzuda en cosas como limpiar bien los discos antes de usarlos, no puede protegernos de nuestra propia impaciencia y de que nos encontremos con restos de una instalación anterior. Si esto sucede, puede darse el caso de que al arrancar el kernel, se queje de que no puede importar un pool que está en un estado calamitoso, y zpool import nos sacará dos pools donde esperábamos uno: El bueno, y el malo, resto de un intento anterior, que además tiene una pinta bastante fea. Claro: hemos escrito otro encima… Pero no en las mismas particiones.

Carallo, ¿y qué hacemos? Nos hemos tirado horas preparando el servidor, luego haciendo la instalación (que finalmente sale bien a la tercera, claro)… Y no queremos empezar desde cero.

Como hay un dios para los informáticos y ayer estaba de guardia, sucedió que el pool bueno es un mirror, y el pool malo está en una partición de uno de los miembros del mirror, según nos ha informado diligentemente el mencionado zpool import. Y para algo tienen que servir los mirror, ¿no es cierto?

Pues hala, nos cargamos el principio del disco que tiene el zpool chungo, donde están el MBR, la tabla de particiones y las etiquetas de los vdevs de zfs:

dd if=/dev/zero of=/dev/sda bs=512 count=2000

Miramos cómo de largo es:

cat /sys/bus/scsi/devices/0\:0\:0\:0/block/sda/size
11721045168

(el angelito en cuestión es un WD Red de 6 TB)

Y nos cargamos también el final, donde hay guardadas las copias de las etiquetas de los vdevs de zfs:

dd if=/dev/zero of=/dev/sda bs=512 count=2000 skip=11721043168

rearrancamos, y genial: El servidor arranca desde el siguiente disco (porque hemos tenido la precaución de pedir a grub que escriba el MBR en todos ellos), el pool malo ha desaparecido, el bueno se monta solito (informando de que se encuentra un poco mal, y de que hagamos algo al respecto) y el sistema arranca. Nos hemos ganado el salario de hoy.

Los controladores virtuales en máquinas virtuales

«Modern OS should use virtio-scsi anyways«. Esta cita de Tom, de Proxmox, originalmente en su foro, suena a buena idea. Ya que hemos sustituído una controladora SCSI (SATA para nosotros, los humildes), con su correspondiente disco, por una mera simulación software de la misma y un trocito de un disco más grande, suena correcto que el controlador por el que el virtual pide sus operaciones sea virtual.

Hay varias razones para ello. La más sencilla es que una controladora virtual (una LSI, por ejemplo, que es una de las más populares) no deja de ser un software cuya tarea es interpretar lo que pide el sistema virtualizado, usando unos comandos que se diseñaron pensando en discos que giran y tienen cabezas magnéticas, y convertirlo a lo que el hipervisor ofrece. Esto último, cada vez más, son discos que se parecen mucho más a la memoria RAM que a lo que tenían en mente los que diseñaron el protocolo SCSI para discos. Entonces, podemos librarnos de un montón de trabajo en todos y cada uno de los accesos del virtual al disco si simplemente cogemos lo que el virtual quiere y directamente se lo damos al hipervisor en su lenguaje nativo. Menos uso de recursos, menos código y menos complejo, igual a menos errores. ¿Algún inconveniente?

Claro que sí. La cosa tiene sus inconvenientes. Los aficionados a la retroinformática («mi ERP requiere Windows Server 2003») descubrirán en seguida que los sistemas operativos diseñados hace quince años no llevan controladores para almacenamiento virtualizado. Oh, por supuesto hay solución: No hay más que bajarse la ISO con los últimos controladores, meterla en el CD virtual, e instalar. Si se trata de una máquina que ya existe, solo queda pegar el cambiazo. Ya de paso, podemos meter el controlador de red virtual. Este último mejorará un pelo el rendimiento y uso de recursos de la red, a cambio de… Su propio interface, por supuesto. Ah, ¿que estábamos hablando de una máquina virtual que ya existe? En ese caso, el ejercicio de malabarismo para cambiar uno por otro sin perder la conexión, lo dejo de manos del lector.

Feliz cumpleaños, Víctor.

Configurar un RAID de HP que corre ESXi

Supongamos que tenemos un servidor HP corriendo ESXi felizmente, accediendo a almacenamiento por red. Y supongamos que se nos ocurre la feliz idea de recopilar unos cuantos de esos discos SAS que tenemos por ahí cogiendo polvo desde que los sustituímos por unos humildes SATA que, siendo mucho menos pijos pero de estado sólido, les han dado una paliza horrorosa en consumo y rendimiento. A la vez.

Quizá el servidor en cuestión está ocupado haciendo lo que hacen los servidores con ESXi normalmente en un entorno de alojamiento en centro de datos, es decir, servir webs con WordPress y rechazar spam. Y nos da cosita interrumpir este feliz quehacer cotidiano solo porque hemos tenido una ocurrencia más.

HP ofrece, al igual que Dell y otros fabricantes, una herramienta para configurar sus controladoras mientras corren lo que sea que están corriendo. En el caso de HP, se puede encontrar fácilmente buscando por HPE Smart Storage Administrator (HPE SSA) CLI for VMware en la web del servicio técnico de HPE. Esto nos ofrecerá un vib, que podemos burguesamente scp al servidor en cuestión y seguidamente

esxcli software vib install -v ssacli-2.65.7.0-5.5.0.vib

(por ejemplo).

La documentación de esta herramienta es todo lo completa y farragosa que acostumbran los grandes fabricantes. Pero, por resumir una larga y diagonal lectura:

A ver, ¿qué hay aquí?

/opt/smartstorageadmin/ssacli/bin/ssacli controller all show config

A ver, quiero un RAID

# /opt/smartstorageadmin/ssacli/bin/ssacli controller slot=0 create type=ld drives=allunassigned raid=10

Y así se teje. Seguidamente, nos vamos a nuestro cliente de vmware obsoleto favorito, creamos un vmfs, y a correr.