Configuración de IPv6 en CentOS

IPv6Vamos a ver cómo configurar un servidor para trabajar tanto con ipv4 como con ipv6, en Linux, sin entrar en detalle de lo que es ipv6, pero repasando algún que otro concepto.

Formato de una dirección IPv6

Lo primero, una ipv6 es una ip formada por 8 grupos de 4 dígitos hexadecimales cada uno, tal que así:

AAAA:AAAA:00BB:AAAA:0000:0000:0000:0000

Se pueden omitir los 0’s de inicio de cada grupo. Así, la IP anterior, quedaría así:

AAAA:AAAA:BB:AAAA:0000:0000:0000:0000

También se puede dejar de incluir los grupos que sean todo 0s, símplemente indicándolo con «::». Hay que tener en cuenta, que únicamente podremos usar una vez el «::» puesto que en otro caso, no sería posible saber a cuantos grupos de ceros se refiere el «::». En nuestro caso, la ipv6 quedaría así:

AAAA:AAAA:BB:AAAA::

Decir que podemos usar cualquiera de éstos formatos para indicarle una ipv6 a nuestro servidor.

Continuar leyendo «Configuración de IPv6 en CentOS»

Sustituir texto en múltiples ficheros en Linux

ReemplazarBueno, aquí un post que empecé a escribir a principios del 2012, con algunos comandos útiles para sustituir texto en Linux, que siempre viene bien tener a mano. Hay que tener en cuenta, que la sustitución de texto en Linux se puede hacer de muchas formas diferentes. A continuación explico uno de los posibles métodos para sustituir texto.

Sustitución múltiple en un único fichero con vi

Si se quiere reemplazar tanto BUG como bug como cualquier combinación de mayúsculas y minúsculas de BUG por ISSUE, bastará con abrir el fichero con «vi» y ejecutar lo siguiente:

:%s/BUG/ISSUE/gi

Es importante notar que para ejecutar el comando, deberemos estar fuera del modo de inserción, para poder introducir los dos puntos del inicio del comando. La «i» del final es la que hace que el texto a buscar sea case insensitive.

Continuar leyendo «Sustituir texto en múltiples ficheros en Linux»

Añadir un disco a un servidor con RAID1 existente

hard diskEn este post se pretende explicar cómo usar la herramienta HP Array Configuration Utility CLI for Linux «hpacucli» para añadir un tercer disco a un servidor HP que ya cuenta con dos discos SAS en RAID1. Nos interesa añadir el tercer disco sin que forme parte del RAID, es decir, queremos añadir el tercer disco como si fuera un disco sin RAID, un disco normal. Ya hablamos de la herramienta hpacucli hace un tiempo aquí.

Entorno

El problema que nos encontramos es que por defecto, los discos los reconoce la controladora del RAID y no aparecen en el fdisk. Así pues, tras añadir físicamente el disco al servidor y tras el reinicio reglamentario para verificar que efectivamente el disco se ha reconocido, nos encontraríamos con que el disco continúa sin aparecer con el fdisk:

[root@myserver]# fdisk -l
Disco /dev/cciss/c0d0: 300.0 GB, 299966445568 bytes

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/cciss/c0d0p1 * 1 126 512000 83 Linux
/dev/cciss/c0d0p2 126 71798 292422656 8e Linux LVM

Disco /dev/dm-0: 234.9 GB, 234881024000 bytes
Disco /dev/dm-1: 10.5 GB, 10536091648 bytes
Disco /dev/dm-2: 21.0 GB, 20971520000 bytes
Disco /dev/dm-3: 31.5 GB, 31474057216 bytes
Disco /dev/dm-4: 1577 MB, 1577058304 bytes

Como se puede ver, únicamente aparece un disco en RAID físico, que sabemos que corresponde con los dos discos de sistema en RAID1. Ni rastro del nuevo disco.

Continuar leyendo «Añadir un disco a un servidor con RAID1 existente»

VPN entre dos servidores con openVPN

openvpntech_logo1Hoy vamos a montar una VPN entre dos servidores ubicados en dos CPDs distintos, para que puedan comunicarse entre ellos a través de un canal seguro. En mi caso, he usado el túnel VPN (Full TLS) para conectar dos servidores MySQL que replican los datos el uno del otro. De esta forma, los datos que se replican de la base de datos viajan por Internet a través de un canal privado y seguro.

He hecho las pruebas en el siguiente entorno:

  • OpenVPN 2.3.2 x86_64-redhat-linux-gnu

Un servidor CentOS 6.4 con 512MB de RAM, instancia de RackSpace (sí, 512MB de RAM, y estamos en 2013, sí).

  • Hostname: vpntest1
  • IP pública: 80.80.80.81
  • IP privada: 10.10.10.81

Un segundo servidor CentOS 6.4 con 512MB de RAM, instancia de RackSpace en un CPD diferente.

  • Hostname: vpntest2
  • IP pública: 80.80.80.82
  • IP privada: 10.10.10.82

Por defecto, los servidores vienen con selinux deshabilitado, iptables parado, y no pueden hacer ping entre sí mediante sus ips privadas pero sí mediante sus ips públicas. He seguido, en mayor parte, este fantástico tutorial que han hecho los técnicos de Rackspace.

También es importante configurar ntp en ambos servidor, para que tengan la hora sincronizada.

Continuar leyendo «VPN entre dos servidores con openVPN»

Automatiza el mantenimiento de directorios temporales en Linux

cleanNo sé cómo he podido vivir tanto tiempo sin conocer tmpwatch, una herramienta que suele venir con el sistema y que nos permite automatizar el mantenimiento de directorios que por su naturaleza, acumulan ficheros temporales que pocas veces se vuelven a usar. tmpwatch, por lo tanto, busca los ficheros y directorios antiguos en una determinada ubicación, y los elimina de forma recursiva. Lo que antes solía hacer con una instrucción como la siguiente, ahora lo haré con tmpwatch:

# eliminación ficheros con más de 365 días desde la última modificación desde el directorio actual
find . -mtime +365 -exec rm {} \;

# eliminación ficheros con más de 365 días desde la última modificación desde el directorio actual y sub-directorios
find . -depth -mtime +365 -exec rm {} \;

Un ejemplo muy claro, es usar tmpwatch para eliminar los ficheros que no se han usado (access time) en los últimos x días (o meses) dentro de directorios como /tmp o ~/Downloads. En cuanto a servidores, seguro que tendemos la típica aplicación que va dejando cientos de archivos temporales en una determinada ubicación, que hemos de estar borrando cada cierto tiempo ya sea a mano o con algún script programado en el cron.

Continuar leyendo «Automatiza el mantenimiento de directorios temporales en Linux»

MongoDB: Recuperar un config server

mongodbHoy me he encontrado, que tras una caída de un servidor que alojaba un config server de mi cluster MongoDB 2.2.0 (sobre un entorno Red Hat), el config server no era capaz de arrancar. Concretamente, al intentar iniciar el config server, podría ver los siguientes logs en el fichero de error:

Thu Sep 12 11:47:37 [initandlisten] dbexception during recovery: 15874 couldn’t uncompress journal section
Thu Sep 12 11:47:37 [initandlisten] exception in initAndListen: 15874 couldn’t uncompress journal section, terminating
Thu Sep 12 11:47:37 dbexit:
Thu Sep 12 11:47:37 [initandlisten] shutdown: going to close listening sockets…
Thu Sep 12 11:47:37 [initandlisten] shutdown: going to flush diaglog…
Thu Sep 12 11:47:37 [initandlisten] shutdown: going to close sockets…
Thu Sep 12 11:47:37 [initandlisten] shutdown: waiting for fs preallocator…
Thu Sep 12 11:47:37 [initandlisten] shutdown: lock for final commit…
Thu Sep 12 11:47:37 [initandlisten] shutdown: final commit…
Thu Sep 12 11:47:37 [initandlisten] shutdown: closing all files…
Thu Sep 12 11:47:37 [initandlisten] closeAllFiles() finished
Thu Sep 12 11:47:37 [initandlisten] shutdown: removing fs lock…
Thu Sep 12 11:47:37 dbexit: really exiting now

Al parecer, el fichero de journal se ha corrompido con la caída del server y ni si quiera es capaz de solucionarse con un «–repair». Aprovechando que mi cluster tiene 3 config servers, he pasado a parar uno de los dos config servers que aun funcionaban, para copiar los datos del dbpath al config server corrompido, con tal de recuperarlo.

El proceso ha sido el siguiente, descrito en la documentación oficial de MongoDB (v2.2): Continuar leyendo «MongoDB: Recuperar un config server»

Limpieza y rotación del slow-query-logs

cleanupYa hablamos de cómo limpiar de forma segura el error-log de MySQL. Otro fichero de logs que puede dar problemas, si lo tenemos activado, es el slow_query_log, que se encarga de almacenar las queries que se han ejecutado sin índices, o que han tardado más de determinados segundos en ejecutarse. Este fichero, por tanto, nos debería servir para identificar puntos de mejora en nuestras queries, pero si tenemos mucho que mejorar, se llenará rápidamente. En mysqlperformanceblog explican cómo crear un script para uso de logrotate para limpiar de forma automática este log de forma periodica, y evitar así problemas mayores.

Primero, crearemos el script de rotación, cogido directamente de mysqlperformanceblog:

[root@myserver]# vi /etc/logrotate.d/mysql-slow

/var/lib/mysql/mysql-slow.log {
nocompress
create 660 mysql mysql
size 1G
dateext
missingok
notifempty
sharedscripts
postrotate
/usr/bin/mysql -u logrotate -pmipassword -e ‘select @@global.long_query_time into @lqt_save; set global long_query_time=2000; select sleep(2); FLUSH SLOW LOGS; select sleep(2); set global long_query_time=@lqt_save;’
endscript
rotate 5
}

Se ha de tener en cuenta, que en la instrucción de postrotate, necesitaremos añadir el usuario y password de acceso al mysql para poder ejecutar esas consultas. También se deberá indicar la ruta al fichero del slow-log en la primera instrucción (marcado en negrita).

Continuar leyendo «Limpieza y rotación del slow-query-logs»

Instalar y configurar REDIS desde source

91018527El título es bastante identificativo. Este post explica cómo instalar y configurar Redis (la base de datos/caché key-value) en CentOS 6 desde source, si por alguna razón no pudiéramos o no quisiéramos instalar mediante yum.

Descarga e instalación

Podemos descargar la última versión estable de Redis directamente desde la web oficial. Bastará con extraer el tarball y ejecutar «make«:

[root@myserver]# wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz
[root@myserver]# tar xzf redis-2.6.13.tar.gz
[root@myserver]# cd redis-2.6.13
[root@myserver]# make

Si todo ha ido bien, ya tendremos Redis listo. Como seguramente habremos descomprimido el tarball en un directorio temporal, en mi caso he preferido cubrirme las espaldas y mover el directorio extraido (y posteriormente recompilado con make) a /etc/redis/installation_files.

[root@myserver]# cd ..
[root@myserver]# mv redis-2.6.13 installation_files
[root@myserver]# mkdir /etc/redis
[root@myserver]# mv installation_files /etc/redis/

Continuar leyendo «Instalar y configurar REDIS desde source»

Monitorizar upload FTP desde script

Upload FTP¿Cómo podríamos saber si un fichero que está siendo subido por FTP ha acabado o no de subirse? Hay algunas posibles soluciones en esta conversación de SuperUser.com, la última de las cuales, es la que he usado.

Para los testeos, he usado un servidor vsFTPd (configurado tal y como expliqué aquí) sobre un servidor CentOS 5.4. Como no tenía ficheros grandes para hacer el test, he creado uno de forma instantánea, con el siguiente comando:

[root@adripc]# fallocate -l 100M test.img
[root@adripc]# ls -lah test.img
-rw-r–r– 1 root root 100M Jul 18 10:20 test.img

La idea es usar lsof para saber el PID del proceso de vsFTPd que está siendo usado para subir el fichero destino, y entoces monitorizar ese PID.  El problema que me he encontrado, al menos con el entorno de test que he usado, es que ese PID de subida puede cambiar durante la subida. No sé bien bien porqué razón, pero en mi caso cambia. Si cambia el PID entonces ya no podremos monitorizar ese PID, ya que el PID habrá finalizado (o no) pero no así la subida, que estará usando otro PID diferente.

En este caso, la solución es más sencilla aun, ya que bastará con símplemente ir consultando mediante lsof y en caso de devolver vacío, nos indicará que no hay ningún proceso usando el fichero y que por tanto, la subida ha finalizado. Así, nos dará igual que el PID cambie. Lo único importante es que durante la subida del fichero, ese archivo tendrá un PID asociado, mientras que cuando haya acabado el upload, no tendrá ningún PID y por tanto lsof devolverá vacío.

Continuar leyendo «Monitorizar upload FTP desde script»

chmod recursivo diferenciando ficheros y directorios

En Linux, en más de una ocasión necesitamos cambiar los permisos de todo un árbol de directorios, por ejemplo, de un proyecto web que encontramos con demasiados permisos. Es habitual, para los directorios, dejar los permisos 755, mientras que para ficheros se suele usar 644.

Pero, ¿cómo modificar los permisos de forma recursiva, diferenciando ficheros de directorios? Unos comandos muy muy útiles (y que podemos encontrar en muchas webs, por ejemplo aquí) son los siguientes:

Modificar los permisos recursivamente únicamente de directorios, desde el punto en el que estamos situados:

find . -type d -exec chmod 755 {} \;

Modificar los permisos recursivamente únicamente de ficheros, también desde el punto en el que estamos situados:

find . -type f -exec chmod 644 {} \;

Con estos dos comandos, podremos cambiar los permisos de forma recursiva, aplicando diferentes permisos para los directorios y para los ficheros. Si se quiere profundizar más, el siguiente enlace explica cómo usar «find» para distinguir los tipos de ficheros.

Fuentes:

http://rainsoftletters.wordpress.com/2008/07/22/recursively-chmodi-only-directories-or-files/