Bitácora de EleKtR0

English - Italiano - Deutsch - Français - Português - русский

6 de diciembre de 2025

Implementaciones libres de S3

Lista de implementaciones open source del protocolo S3 para almacenamiento en red: 

RustFS
PetaSAN
Minio
Garage
SeaweedFS
Ceph+RadosGateway

Etiquetas: ,

29 de junio de 2024

Mis optimizaciones al instalar un sistema Linux

Anoto por aquí una serie de cosas a tener en cuenta al instalar un nuevo sistema Linux para optimizarlo todo lo posible: 

- Habilitar zram. En Debian instalo el paquete zram-tools y habilito el servicio zramswap.service en systemctl

- Usar noatime,nodiratime o relatime en los sistemas de ficheros de Linux para evitar escrituras innecesarias (/etc/fstab)

- Añadir los parámetros --disk-cache-dir=/dev/null --disk-cache-size=1 al arranque de Chrome / Chromium para deshabilitar la caché y evitar escrituras innecesarias en disco (/etc/chromium.d/default-flags).

- Establecer browser.cache.disk.enable=false en about:config de Firefox para deshabilitar la caché y evitar escrituras innecesarias en disco.

- Deshabilitar servicios innecesarios en systemctl.

- Deshabilitar ipv6 si no vamos a usarlo: 

  net.ipv6.conf.all.disable_ipv6 = 1 

  net.ipv6.conf.default.disable_ipv6 = 1 

  net.ipv6.conf.lo.disable_ipv6 = 1 

  net.ipv6.conf.tun0.disable_ipv6 = 1 

- Deshabilitar ipv6 en NetworkManager, ya que por defecto escucha en el puerto 546/udp:

 nmcli connection modify <nombre_conexion> ipv6.method ignore 

- Montar /tmp y /var/tmp como tmpfs

 

Etiquetas: , ,

18 de abril de 2024

Obteniendo licencia de Windows OEM desde la BIOS

Para obtener el número de licencia de Windows versión OEM que tengamos en la BIOS podemos usar este comando en Linux:
strings /sys/firmware/acpi/tables/MSDM | grep -E '[A-Z0-9]{5}(-[A-Z0-9]{5}){4}'
Necesitaremos ejecutarlo como usuario root para que el comando funcione.

En Windows se puede consultar ejecutando este comando en PowerShell como administrador:
wmic path softwarelicensingservice get OA3xOriginalProductKey

Etiquetas: , ,

28 de diciembre de 2023

Chuleta rápida de comandos Linux

La web cheat.sh es una maravilla que permite obtener una referencia rápida y ejemplos de uso de comandos Linux.

Para consultar algo desde línea de comandos de forma rápida podemos añadir al fichero .bashrc lo siguiente:

alias cheat='function _cheat(){ curl cheat.sh/$1; };_cheat'

 Y lo usaríamos de la siguiente forma para consultar ejemplos de openssl:

cheat openssl

Etiquetas: , ,

22 de octubre de 2023

Aceleracion hardware en el navegador

Hay muchos artículos donde explican cómo habilitar la aceleración por hardware en el navegador pero no es tan sencillo encontrar la forma de consultar en los principales navegadores de Linux si la aceleración por hardware está funcionando por lo que dejo las URLs necesarias para Chrome / Chromium y Firefox:

Chrome / Chromium: chrome://gpu/

Firefox: about:support

En el caso de Chrome y derivados podemos consultar información interna sobre las reproducciones que estemos realizando, si por ejemplo estamos reproduciendo un vídeo en Youtube, abriendo otra pestaña con la URL chrome://media-internals/

Hay una lista de las URLs internas de Chrome y derivados para obtener todo tipo de información en https://beebom.com/chrome-urls/

Etiquetas: , , , , ,

12 de mayo de 2023

Instalación desatendida de Red Hat Enterprise Linux

Para realizar una instalación desatendida de Red Hat Enterprise Linux con un fichero kickstart necesitaremos crear este fichero a partir del que se copia en la ruta /root/anaconda-ks.cfg tras una instalación previa o bien desde cero con la documentación de este formato de fichero El siguiente paso será arrancar con una ISO de RHEL, que puede ser Boot iso ya que no vamos a necesitar otra cosa si instalamos los paquetes desde un repositorio en red, con estos parámetros en la pantalla inicial:
inst.ks=http://IP_SERVIDOR_WEB/ks.cfg ip=IP_ESTATICA::GATEWAY:NETMASK:HOSTNAME.DOMAIN:INTERFAZ:none 
 

 IP_SERVIDOR_WEB es la ip del servidor web donde alojamos el fichero kickstart

IP_ESTATICA es la ip de la interfaz de red local que se configura inicialmente donde instalamos para poder acceder al servidor web anterior

GATEWAY ip del gateway

NETMASK máscara de subred de la interfaz de red local

HOSTNAME.DOMAIN nombre y dominio que tendrá inicialmente el equipo

INTERFAZ nombre de la interfaz de red, normalmente enp1s0 o eth0 

 

Un ejemplo de fichero kickstart sería el siguiente:

# Generated by Anaconda 34.25.0.29
# Generated by pykickstart v3.32
#version=RHEL9

text 
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%addon com_redhat_kdump --disable

%end

# Keyboard layouts
keyboard --xlayouts='es'
# System language
lang es_ES.UTF-8

# Network information
network  --bootproto=dhcp --device=enp1s0 --noipv6 --no-activate

# Use CDROM installation media
cdrom

%packages
@^minimal-environment

%end

# Run the Setup Agent on first boot
firstboot --enable

# Generated using Blivet version 3.4.0
ignoredisk --only-use=vda
autopart
# Partition clearing information
clearpart --none --initlabel

timesource --ntp-disable
# System timezone
timezone Europe/Madrid --utc

# Root password
rootpw --iscrypted $6$d2fDfieZew3$7dP/2Movv18TJoIZ9KEM4Iwei0NF6m6a9dDAGMj013f2qu6ReLIv9geB/BFBcQ1vrjKFA5VICIo0yS8S4ze0r/

Etiquetas: ,

10 de mayo de 2023

Desconectar un pendrive / disco USB de forma segura

La forma más segura de desconectar un disco externo USB o un pendrive en Linux es desmontar el dispositivo con umount y ejecutar uno de estos dos comandos, dependiendo de lo que tengamos instalado en el sistema y distribución Linux:
udisksctl power-off -b /dev/sdb

udisks --detach /dev/sdb
El disco /dev/sdb debe cambiarse por el que queramos desconectar de forma segura.

Etiquetas: ,

28 de julio de 2020

Obtener grupos en inventario de Ansible

Dos formas de obtener una lista, desde línea de comandos, de los grupos que tiene el inventario de Ansible:

ansible localhost -m debug -a 'var=groups'

ansible localhost -m debug -a 'var=groups.keys()'

Etiquetas: , ,

10 de julio de 2020

Obtener URLs de publicación de servicios Docker y K8S


Para obtener las URLs donde se publican servicios, usando Docker Enterprise:
for servicio in $(docker service ls -f label=com.docker.lb.hosts --format "{{.Name}}")
do

docker service inspect "$servicio" --format '{{ range $k, $v := .Spec.Labels }}{{ $k }}={{ $v }} {{end}}' | \
tr " " "\n" | awk -F= '/com.docker.lb.hosts/ { print $NF }'

done;

Para obtener las URLs donde se publican servicios mediante Istio Ingress en Kubernetes:
kubectl get virtualservice -A --no-headers -o custom-columns=HOSTS:.spec.hosts | sed 's/\[//; s/\]//; s/ /\n/' 

Etiquetas: , , ,

21 de mayo de 2020

Configuración de swap con zram

Para usar dispositivos zram en la configuración de swap en Fedora es tan sencillo como instalar el paquete zram y configurar el fichero /etc/zram.conf con el porcentaje de memoria que asignaremos como swap pero en otras distribuciones lo más sencillo es configurar una regla de udev para asignar la memoria que queramos, formatear el dispositivo con mkswap y configurarlo en /etc/fstab con una prioridad alta para que se use preferiblemente antes que la swap en disco.


Para estas distribuciones donde no es tan sencillo como instalar un paquete y arrancar un servicio, pongo este script donde uso 1024M de memoria para swap con algoritmo de compresión lz4:


echo "zram" > /etc/modules-load.d/zram.conf

echo "options zram num_devices=1" > /etc/modprobe.d/zram.conf

echo 'KERNEL=="zram0", ATTR{disksize}="1024M", ATTR{comp_algorithm}="lz4", \
RUN="/sbin/mkswap /dev/zram0", TAG+="systemd"' > /etc/udev/rules.d/99-zram.rules

echo "/dev/zram0 none swap defaults,pri=1000  0 0" >> /etc/fstab


Hay que tener en cuenta la ruta del comando mkswap, que en derivados de RedHat está en /sbin, y la cantidad máxima de memoria que queremos asignar como swap comprimida, en este ejemplo es 1024M. El algoritmo de compresión usado por defecto es lzo pero lz4 es más rápido al comprimir / descomprimir. Los algoritmos de compresión disponibles dependen de las opciones de compilación del kernel usado. Pueden consultarse con el comando cat /sys/block/zram0/comp_algorithm

Al reiniciar el sistema el comando zramctl debe mostrarnos el dispositivo /dev/zram0 con la memoria usada tras comprimir y lo que ocuparía sin comprimir. El comando cat /proc/swaps debe mostrar los dispositivos de swap configurados, el uso de cada uno y su prioridad. Se hará uso de dispositivos de swap por orden de prioridad de mayor a menor

Recordar que si se hace un uso intensivo de swap habrá un mayor uso de CPU al comprimir / descomprimir las páginas de memoria que entran o salen del dispositivo zram

Etiquetas: , , , ,

17 de abril de 2020

Resolución de nombres con Python y Perl desde línea de comandos


Ejemplo de resolución de nombres desde línea de comandos usando Python:

python -c "import socket; print ( socket.gethostbyname('google.com') )"


Ejemplo de resolución de nombres desde línea de comandos usando Perl:

perl -e 'use Socket; use Data::Dumper; 

    @addrs = gethostbyname("google.com") or die "No puedo resolver el nombre$!\n"; 

    @addrs = map { inet_ntoa($_) } @addrs[4 .. $#addrs]; 

    foreach my $addr (@addrs) { print "$addr\n"; }'


Esta chuleta viene bien cuando no tenemos a mano una forma rápida de resolver un nombre de equipo con un comando como dig, host, nslookup, getent, etc.

Etiquetas: ,

17 de septiembre de 2016

Reinstalar / reparar Grub


Para reinstalar grub en un sistema que hemos montado arrancando previamente desde un livecd como CloneZilla, System Rescue CD y similares, necesitaremos montar algunos sistemas de ficheros especiales para que grub-install o update-grub no muestren errores al acceder a las unidades de disco.


1º  En primer lugar, podemos montar la partición raíz del sistema a restaurar en /mnt, por ejemplo:

mount -t auto /dev/sda2 /mnt

2º Necesitaremos montar /proc, /sys y /dev dentro de /mnt, de esta forma:

mount -t sysfs sys /mnt/sys
mount -t proc none /mnt/proc
mount -o bind /dev /mnt/dev

3º Hacemos chroot para que grub encuentre todas las rutas al ejecutarlo:
chroot /mnt /bin/bash

4º Si tenemos el contenido de /boot en otra partición , habría que montarla dentro de /mnt/boot. Por ejemplo:


mount -t auto /dev/sda1 /boot

5º Ya podemos ejecutar grub-install o update-grub para reparar el gestor de arranque. Por ejemplo:

grub-install --no-floppy /dev/sda


Etiquetas: , ,

10 de septiembre de 2016

Chuleta para montar cluster OCFS2 desde línea de comandos


Chuleta para configurar un cluster con OCFS2 desde línea de comandos:

# Configuramos el servicio o2cb:
/etc/init.d/o2cb configure;
/etc/init.d/o2cb start;

# Creamos el cluster:
o2cb_ctl -C -n micluster -t cluster;

# Añadimos los nodos:
o2cb_ctl -C -n nodo1 -t node -a number=0 \
      -a ip_address=192.168.0.10 -a ip_port=7777 -a cluster=micluster;

o2cb_ctl -C -n nodo2 -t node -a number=1 \
      -a ip_address=192.168.0.11 -a ip_port=7777 -a cluster=micluster;

# Para detener los servicios:
service ocfs2 stop ; service o2cb stop;

# Para arrancar los servicios:
service o2cb start && service ocfs2 start;

Etiquetas: ,

27 de julio de 2016

Algunas distribuciones Linux no tan conocidas

Al menos yo no las conocía aunque soy mal ejemplo porque hace tiempo que no sigo las muchas distribuciones que salen.

Estas distribuciones me han parecido interesantes para probarlas:

antiX - Una distribución basada en Debian, ligera, sin systemd, que arranca rápidamente desde pendrive y permite salvar cambios en la versión live.

Parrot Security OS - Distribución para realizar auditorías de seguridad que tiene versiones para Raspberry Pi y otros gadgets basados en procesadores ARM además de las típicas para arquitectura x86.

CoreOS - Es un sistema operativo ligero basado en kernel Linux más que una distro, creado para el despliegue en cluster de contenedores y basado en ChromeOS.

KaOS - Una distribución creada desde cero y centrada en KDE/Qt para arquitectura x86_64.

Alpine Linux - Distribución muy ligera para sistemas embebidos. Tiene versiones para gadgets con procesadores ARM.

Kali Linux - Distribución orientada a la seguridad. Esta distro es bastante más conocida pero la incluyo para los más despistados.

Etiquetas: , ,

3 de octubre de 2015

Vídeos de la FrOSCon 2015

Vídeos de la Free and Open Source Software Conference 2015 que se realizó en Alemania. Algunos vídeos están en alemán pero también hay otros en inglés.

Etiquetas: , , ,

25 de agosto de 2015

Vídeos de conferencias Debconf 2015

Ya están disponibles los vídeos de las conferencias DebConf 2015

La lista de conferencias se puede ver en la web del evento: DebConf15 - All events

Etiquetas: , ,

8 de abril de 2015

Buscar usuarios que puedan logarse en un sistema Linux

Un mini script para buscar usuarios que puedan logarse en el sistema y no sea root:
for usuario in `grep -v -e "nologin$\|false$" passwd|awk -F":" '{ print $1 }'`;
do
 grep -E "^${usuario}:[^*\!]:" /etc/shadow|grep -v -e '^root:'
done;

Se aceptan sugerencias y correcciones

Etiquetas: , ,

Algunos parámetros útiles en SSH

Para que ssh no pregunte si debe agregar al fichero .ssh/known_hosts la máquina a la que nos vamos a conectar por primera vez, cosa especialmente cansina si nos conectamos a decenas de máquinas, debemos usar el parámetro -o StrictHostKeyChecking=no El mensaje que muestra SSH al conectar por primera vez a un host suele ser de este tipo:
The authenticity of host '111.222.333.444 (111.222.333.444)' can't be established.
RSA key fingerprint is f3:cf:58:ae:71:0b:c8:04:6f:34:a3:b2:e4:1e:0c:8b.
Are you sure you want to continue connecting (yes/no)? 
Usando el parámetro -o StrictHostKeyChecking=no al ejecutar SSH se evita la dichosa pregunta. Ejemplo:
ssh -o StrictHostKeyChecking=no usuario@servidor
Si nos conectamos a servidores que pueden estar apagados, no necesitaremos esperar el timeout por defecto reduciendo el tiempo con el parámetro -o ConnectTimeout=segundos
ssh -o ConnectTimeout=5 usuario@servidor

Etiquetas: , ,

7 de abril de 2015

Registro de traps SNMP en rsyslog en Debian 6

Una receta ultra simplificada de cómo registrar traps SNMP en rsyslog. Concretamente he usado Debian 6 pero no debe cambiar mucho en otras versiones. Primero debemos instalar el paquete snmpd en Debian, deshabilitar el demonio del servidor snmpd y habilitar el de snmptrapd modificando el fichero /etc/default/snmpd de esta forma:
SNMPDRUN=no
TRAPDRUN=yes
En el fichero /etc/snmp/snmptrapd.conf debemos configurar la comunidad de la que recibiremos los traps, por ejemplo: authCommunity log public Reiniciamos el servicio snmpd con service snmpd restart y debemos tener el proceso snmptrapd en ejecución y el puerto UDP 162 a la escucha. Para que rsyslog filtre el mensaje que snmptrapd generará en el log del sistema podemos poner una regla como la siguiente en /etc/rsyslog.conf:
if ($programname == 'snmptrapd') then /var/log/snmptrapd.log
& ~
La cadena "& ~" sirve para que al aplicarse la regla de filtrado del if el mensaje se guarde en el fichero indicado y no se apliquen más reglas que dupliquen el mensaje en otros ficheros de log.
Para probar a enviar traps y ver si funciona, he usado este código que he encontrado en The Linux Documentation Project:
use strict;
use vars qw($session $error $response);

use Net::SNMP;

($session, $error) = Net::SNMP->session(
   -hostname  => shift || '192.168.1.12',
   -community => shift || 'public',
   -port      => shift || 162 
);

if (!defined($session)) {
   printf("ERROR: %s.\n", $error);
   exit 1;
}

my $count = 0;

$response = 1;
while ( $response ) {
   $response = $session->trap();
   $count++;
   sleep 5;
   print "Sending trap ($count)\n";
}

$session->close();
exit 0;


Etiquetas: , , ,

21 de enero de 2015

Instalar un cluster en Debian desde 0

1º Instalar Corosync y Pacemaker
aptitude install corosync pacemaker
Esto crea un usuario hacluster en un grupo llamado haclient

2º Modificaremos en /etc/corosync/corosync.conf la ip de la interfaz de red que usará el cluster para comunicarse. Por defecto podemos encontrar 127.0.0.1 en bindnetaddr Si vamos a usar multicast para la comunicación y localización de nodos en el cluster podemos dejar la ip por defecto en mcastaddr si no tenemos otros servidores que vayan a usarla.
        interface {
                # The following values need to be set based on your environment
                ringnumber: 0
                bindnetaddr: 192.168.1.81  # ip de la interfaz a usar por el cluster
                mcastaddr: 226.94.1.1
                mcastport: 5405
        }

Aprovecharemos para configurar el log en un fichero separado puesto que el cluster generará mucha información y hará que el log del sistema sea inmanejable. Para ellos pondremos en el apartado logging de /etc/corosync/corosync.conf lo siguiente:
 to_syslog: no     # cambiar el valor por defecto yes a no  
 to_logfile: yes   # cambiar el valor por defecto no a yes para desviar la salida a un fichero
 logfile: /var/log/cluster.log  # esta línea no existe y hay que añadirla para indicar el nombre del fichero de log
3º Para que el servicio arranque, pondremos START=yes en /etc/default/corosync y ejecutaremos:
 service corosync start 
4º Configurar el resto de nodos del cluster de la misma forma si no lo hemos hecho en los pasos anteriores y arrancar el servicio corosync.

5º El servicio gestor de recursos del cluster pacemaker no arranca si no indicamos un recurso stonith antes pero temporalmente podemos poner en las propiedades del cluster con el comando crm configure edit la propiedad stonith-enabled="false" para que nos deje arrancar el servicio pacemaker. Ejemplo:
property $id="cib-bootstrap-options" \
        dc-version="1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff" \
        cluster-infrastructure="openais" \
        expected-quorum-votes="2" \
        no-quorum-policy="ignore" \
        stonith-enabled="false"
Si tenemos un cluster de sólo dos nodos es necesaria la propiedad no-quorum-policy="ignore" para que al fallar un nodo se mantengan levantados los servicios en otro nodo ya que se pierde el quorum. Si tenemos más de un nodo no es necesario y además contrapropucente porque puede darse una situación de split brain. El comando crm_verify -L nos mostrará errores de configuración del cluster si no arranca algún servicio. En versiones anteriores de Pacemaker se arrancaba el servicio con el script en /etc/init.d pero en la versión actual, incluida en Debian Wheezy el servicio pacemaker es ejecutado como plugin de Corosync y no hay que ejecutarlo como servicio del sistema.

6º Probaremos a configurar manualmente una ip flotante en el cluster. Recomendable usar alguna herramienta gráfica, como Hawk o crm_gui, para configurar los recursos. Para configurarla manualmente añadimos estas líneas con crm configure edit
primitive ip-apache ocf:heartbeat:IPaddr2 \
 params cidr_netmask="24" ip="192.168.1.88" \
 op stop interval="0" timeout="20s" \
 op start interval="0" timeout="20s" \
 op monitor interval="10s" timeout="20s"
Con el comando crm_mon podremos comprobar que se está ejecutando el recurso en uno de los nodos (con un ping se puede probar que la ip del ejemplo, 192.168.1.88, responde). Ahora podemos añadir/quitar recursos en el cluster y configurar el recurso stonith para que un servidor inestable se reinicie o apague. No nos olvidemos de poner la propiedad stonith-enabled="true" cuando configuremos stonith.

Etiquetas: , ,