Archivos categorizados en: GNU/Linux

Aumentar la memoria swap con ayuda de un archivo swap

Categoría(s): Debian, FreeBSD, GNU/Linux, Línea de comandos, Servidores, UNIX

Muy rara vez puede ocurrir que un servidor se vea colapsado a tal punto que el acceso por consola o remoto se vea interrumpido y el resto de los servicios que prestan se hagan inaccesible. Este tipo de falla podría originarse de diversas causas que puede ser un tema interesante en este Blog.
Sin embargo, para no salir del tema que quiero citar aquí, sólo mencionaré algunas de las posibles razones que suele pasar por la mente de un Administrador de Sistemas u otras personas que sean responsables de mantener un servidor, tales como; un disco duro fallido,  que el sistema haya sido atacado por un hacker,  se daño el LVM d) el Firewall está bloqueando los puertos.

Pero como dije al principio, rara vez puede ocurrir y menos pensar que la falla se debe a la memoria, es decir, “se agotó la memoria RAM” e incluso la memoria swap. Esto compromete el sistema de paginación de memoria del servidor –obviamente– lo que origina que los servicios que se corren en el servidor no puedan gestionarse. Casi todo se detiene.-

Un caso ejemplo; un servidor de correos que maneja una diversidad de servicios que operan al unísono y que tienen la tarea de atender peticiones concurrentes, del MTA, Apache, PHP, servicio Webmail, anti-spam, antivirus, MySql, entre otros.

Solución 1: agregar memoria RAM adicional

Sin embargo, en un momento dado que no cuentas con partes o piezas que puedas usar como spare, y sabes que el servidor tiene instalada una cantidad de memoria relativamente aceptable –mas de 3 Gb– entonces puedo optar por buscar otra solución si la situación se debe a que el sistema operativo no reconoce mas allá de esta cantidad de memoria.

Solución 2: Instalar y arrancar con un Kernel que haga un uso mas extensivo de memoria”

En Linux, puedes optar por varios Kernel del tipo “bigmem”

root@mail:~# aptitude search linux-image|grep bigmem
p   linux-image-2.6-686-bigmem      - Linux kernel 2.6 image on PPro/Celeron/PII
p   linux-image-2.6-686-bigmem-etch - Linux 2.6-etchnhalf image on PPro/Celeron/
p   linux-image-2.6.18-4-686-bigmem - Linux 2.6.18 image on PPro/Celeron/PII/PII
p   linux-image-2.6.18-5-686-bigmem - Linux 2.6.18 image on PPro/Celeron/PII/PII
i   linux-image-2.6.18-6-686-bigmem - Linux 2.6.18 image on PPro/Celeron/PII/PII
p   linux-image-686-bigmem          - Linux kernel image on PPro/Celeron/PII/PII

Ah, pero si eso no es posible arrancar el sistema con un kernel de tipo bigmem, porque otra limitación con que te enfrentas es que la plataforma instalada –Zimbra, por citar un ejemplo- se programó con una configuración de memoria específica y un kernel base, entonces sugiero:

Solución 3: Ampliar la memoria Swap

Para lograr esto, podría sugerir inmediatamente que uses alguna herramienta de particionado basado en Gparted y así ampliar tu partición swap, ya que hoy día es tan simple hacerlo de manera gráfica. Sin embargo, cambiar el tamaño de tu partición en un sistema que está en producción es un cambio severo que podría afectar todo el servidor.

Para lograr aumentar la memoria swap, lo haremos de una manera simple tan solo agregando un archivo. Tan simple que usaré el entorno de trabajo favorito para mi; una consola de comandos

En primer lugar, verifico cuanta espacio de memoria swap hay en el servidor;

root@mail:~# swapon -s
Filename				Type		Size	Used	Priority
/dev/cciss/c0d0p12                      partition	979924	679472	-1

Los números bajo “Size” y “Used” están en Kilobytes. En este sistema usamos aproximadamente 680 Mb de 979 Mb de memoria Swap —y en este instante la carga del servidor ha bajado debido al horario de trabajo.

Se necesita un archivo auxiliar de memoria swap

Ahora, conocer cuanto espacio en disco hay disponible para averiguar donde ponerlo. Ejecutaré el comando “df” –disminutivo de “disk free”– desde la de línea de comandos para genera una salida así:

root@mail:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/cciss/c0d0p5     6.5G  1.5G  4.7G  24% /
tmpfs                 1.7G     0  1.7G   0% /lib/init/rw
udev                   10M   96K   10M   1% /dev
tmpfs                 1.7G     0  1.7G   0% /dev/shm
/dev/cciss/c0d0p13     64G  180M   60G   1% /backup
/dev/cciss/c0d0p1      92M   19M   69M  22% /boot
/dev/cciss/c0d0p6     6.5G  3.7G  2.5G  61% /home
/dev/cciss/c0d0p10     16G  174M   15G   2% /opt
/dev/cciss/c0d1p1     673G  176G  361G  33% /opt/zimbra
/dev/cciss/c0d0p9     6.5G  214M  5.9G   4% /tmp
/dev/cciss/c0d0p7     6.5G  464M  5.7G   8% /usr
/dev/cciss/c0d0p8     6.5G  994M  5.2G  16% /var
/dev/cciss/c0d0p11     23G  1.5G   21G   7% /var/log

El switch “-h” usado aquí para quienes no conozcan su uso. Se utiliza ampliamente en varios comando de Unix o Linux para mostrar la salida en un formato –human-readable– legible, tal como lo reseña el “man df” o “man ls”.

Ahora bien, vemos que entre todas las particiones disponible existe /backup que cuenta con suficiente espacio libre y no ha sido utilizado ni siquiera en un 50%. Tomaré esta partición para crear allí el archivo auxiliar de –swapping– memoria swap.

Para crear el archivo, usaré el comando “dd” –data dump– de manera cuidadosa.

root@mail:~# dd if=/dev/zero of=/backup/extraswap bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 32.8718 seconds, 65.3 MB/s

He utilizado 2048 en el “count” para crear un archivo de 2 Gb. Los disminutivo “if” y “of” indican “infile” y “outfile”, archivo entrante y archivo de salida. El argumento “/dev/zero” nos dará una salida en blanco al archivo de salida.

Reviso la partición en “/backup” y tengo esto:

root@mail:~# ls -lpa /backup/
total 2099220
-rw-r--r-- 1 root root 2147483648 2009-10-28 16:31 extraswap
drwx------ 2 root root      16384 2009-04-07 14:34 lost+found

Ahora que cuento con un archivo en disco, necesito prepararlo para que sea usado como una partición swap.

root@zmail:~# mkswap /backup/extraswap
Setting up swapspace version 1, size = 2147479 kB
no label, UUID=1ea42c4e-2d62-456a-b0f4-b35abc7bad12

He usado el comando “mkswap” cuidadosamente en hacer referencia al archivo en la partición “/backup” y con esto logro que se convierta en un archivo consumible para el Kernel de Linux en modo swap.

Para activar este nuevo archivo de partición, ejecuto:

root@mail:~# swapon /backup/extraswap

Reviso cuando memoria swap existe ahora;

root@zmail:~# swapon -s
Filename				Type		Size	Used	Priority
/dev/cciss/c0d0p12                      partition	979924	679472	-1
/backup/extraswap                       file		2097144	0	-2

Con esto se ha comprobado que el Kernel de Linux está utilizando más memoria auxiliar. Sin embargo, no he terminado. Es necesario hacer este cambio permanente, editando el archivo “/etc/fastab”.

Si se reinicia el servidor ahora, este archivo auxiliar de swap no estará activo, y tendré que utilizar de nuevo “ swapon /backup/extraswap”.

Primero hago una copia de la manera como guste o sea conveniente.

root@zmail:~# cp /etc/fstab /backup/
root@zmail:~# ls /backup/ -lpa
total 2099232
drwxr-xr-x  3 root root       4096 2009-10-28 16:43 ./
drwxr-xr-x 22 root root       4096 2009-10-08 13:15 ../
-rw-r--r--  1 root root 2147483648 2009-10-28 16:39 extraswap
-rw-r--r--  1 root root       1018 2009-10-28 16:43 fstab
drwx------  2 root root      16384 2009-04-07 14:34 lost+found/
root@zmail:~# cp /etc/fstab /etc/fstab.backup-281009
root@zmail:~# ls -lpa /etc/fstab*
-rw-r--r-- 1 root root 1018 2009-04-07 16:01 /etc/fstab
-rw-r--r-- 1 root root 1018 2009-10-28 16:44 /etc/fstab.backup-281009

Yo he realizado dos copias en dos directorios diferentes. —por si acaso– y también la he verificado ambas.

Veamos que hay en “/etc/fstab”:

root@zmail:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
#
proc            /proc           proc    defaults        0       0
/dev/cciss/c0d0p5 /               ext3    defaults,errors=remount-ro 0       1
/dev/cciss/c0d0p13 /backup         ext3    defaults        0       2
/dev/cciss/c0d0p1 /boot           ext3    defaults        0       2
/dev/cciss/c0d0p6 /home           ext3    defaults        0       2
/dev/cciss/c0d0p10 /opt            ext3    defaults        0       2
/dev/cciss/c0d1p1 /opt/zimbra     ext3    defaults        0       2
/dev/cciss/c0d0p9 /tmp            ext3    defaults        0       2
/dev/cciss/c0d0p7 /usr            ext3    defaults        0       2
/dev/cciss/c0d0p8 /var            ext3    defaults        0       2
/dev/cciss/c0d0p11 /var/log        ext3    defaults        0       2
/dev/cciss/c0d0p12 none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0

Ahora, edito el “/etc/fstab” para agregar el punto de montaje del archivo auxiliar swap justo debajo de la línea del swap, de este modo:

/backup/extraswap  none            swap    sw              0       0

Guardo los cambios en el archivo y para comprobar que el cambio no contiene errores;

root@zmail:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
#
proc            /proc           proc    defaults        0       0
/dev/cciss/c0d0p5 /               ext3    defaults,errors=remount-ro 0       1
/dev/cciss/c0d0p13 /backup         ext3    defaults        0       2
/dev/cciss/c0d0p1 /boot           ext3    defaults        0       2
/dev/cciss/c0d0p6 /home           ext3    defaults        0       2
/dev/cciss/c0d0p10 /opt            ext3    defaults        0       2
/dev/cciss/c0d1p1 /opt/zimbra     ext3    defaults        0       2
/dev/cciss/c0d0p9 /tmp            ext3    defaults        0       2
/dev/cciss/c0d0p7 /usr            ext3    defaults        0       2
/dev/cciss/c0d0p8 /var            ext3    defaults        0       2
/dev/cciss/c0d0p11 /var/log        ext3    defaults        0       2
/dev/cciss/c0d0p12 none            swap    sw              0       0
/backup/extraswap  none            swap    sw              0       0
/dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0

Ahora bien.!!. Después de todo lo que se ha hecho, puedo reiniciar el servidor ahora o dejarlo funcionado como tal. A este punto, he logrado solventar la carencia de memoria swap necesaria para mantener operativo un servidor.

Para futuras instalaciones, debería asignar mas espacio para la partición swap… o –preferiblemente– poner más memoria RAM en el servidor y antes de proceder a instalar y configurar las aplicaciones y los servicios, habilitar el Kernel tipo “bigmem”.

Hasta la próxima publicación… he perdido la oportunidad de irme a mi casa temprano para vacilarme mi película favorita: CSI Miami… –veré si llego a tiempo para ver LIFE.

Seguir leyendo» Sin comentarios

Sustitución de texto con sed + regexp

Categoría(s): Debian, FreeBSD, GNU/Linux, Línea de comandos, Mac OS X, UNIX

Para esta tarea, usaremos el comando “sed”.

Cuento con un archivo como ejemplo, cuyo nombre es sed-prueba.txt, que contiene las siguientes líneas:

#Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

Se han dejado algunos errores a propósito para cubrir el objetivo de esta entrada.

Antes de proseguir, haré un breve reseña del comando:

Sed es un editor de flujo. Un editor de flujo se usa para realizar transformaciones básicas de texto.

Sed

  • sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.
  • El nombre Sed es una abreviación para “stream editor” y su utilidad se deriva de los comando del editor de línea ed.  (ed fue el primer editor en UNIX).
  • Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con vi o emacs.
  • sed lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.

Revisaremos como utilizar el comando de sustitución “s”.  Este comando probablemente sea el más importante dentro de la ejecución del sed, y cuenta con diferentes opciones.

El comando “s” intenta hallar coincidencia del patrón en relación a la expresión regular REGEXP.  Si la coincidencia es positiva, entonces la porción del patrón que se ha encontrado será cambiado con el reemplazo REPLACEMENT.

Sintaxis:

    $ sed ‘ADDRESSs/REGEXP/REPLACEMENT/FLAGS’ archivo

Otra sintaxis:

    $ sed ‘PATTERNs/REGEXP/REPLACEMENT/FLAGS’ archivo

veamos la explicación de la sintaxis:

  • s el comando de sustitución.
  • / el delimitador
  • REGEXP la expresión regular para buscar
  • REPLACEMENT el contenido a sustituir

FLAGS  puede ser cualquiera de los siguiente;

  • g reemplaza todas las instancias de REGEXP con REPLACEMENT
  • n podría ser cualquier número, reemplaza N número de instancias de REGEXP with REPLACEMENT
  • p si la sustitución se hizo, entonces muestra el nuevo patrón.
  • i realiza la búsqueda REGEXP en modo no sensitivo a caracteres
  • w salva en archivo si la sustitución fue hecha, muestra por consola el resultado del archivo dado
  • Puede usarse diferente delimitadores ( uno de  @ % ; : )  en vez de /

Tal como mencioné al principio,  ya tengo un archivo como ejemplo.  Si gusta puedes hacer una copia de éste y creas en tu propio computador un archivo y pegas, luego lo salvas con el nombre que te parezca. Así podría ser más práctico realizar las prueba tu mismo.  Aquí usaré sed-prueba.txt como nombre de archivo.

Ahora bién, mostremos el contenido,

user@computer:$ cat sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

Comenzaré con algunos ejemplos para demostrar la acción de sustitución.

1.  Sustituir la palabra “Linux” por “GNU/Linux” usando sed s//

Es importante escapar los caracteres especiales cuando se realizan manejo de expresiones regulares. De lo contrario, podemos recibir errores como este:

user@computer:$ sed 's/Linux/GNU/Linux/' sed-prueba.txt
sed: -e expression #1, char 13: unknown option to `s'

Pues para situaciones donde el caracter a reemplazar se parece al delimitador, entonces la manera más adecuada para la sustitución es hacerlo así:

user@computer:$ sed 's/Linux/GNU\/Linux/' sed-prueba.txt
# Guia de instrucciones
1. Administracion GNU/Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en GNU/Linux, etc
5. Windows- Sysadmin, reboot etc.

Se puede apreciar el cambio de la primera y cuarta línea. Ahora haré otra sustitución de la palabra “Scriting” por “Scripting”.

user@computer:$ sed 's/scriting/Scripting/' sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

No se produjo cambio alguno. Ahora intentaremos de nuevo, pero esa vez haciendo caso omiso a  mayúscula o minúscula “case-sensitive”.

user@computer:$ sed 's/scriting/Scripting/i' sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux, Unix, Linux Scripting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux, etc
5. Windows- Sysadmin, reboot etc.

2. Sustituir todas las apariciones de la palabra usando sed s//g

Voy a reemplazar todas las ocurrencias de la palabra “Linux” a “Linux-Unix” de manera global utilizando  el flag de sustitución “g”.

user@computer:$ sed "s/Linux/Linux-Unix/g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

3. Sustituir sólo la segunda ocurrencia de la palabra usando sed s//2

Tomando el resultado anterior, en la línea “1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.”  sólo la 2da. ocurrencia de la palabra “Linux-Unix” será reemplazada por “LINUX”.

user@computer:$ sed "s/Linux-Unix/LINUX/2" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux-Unix, Unix, LINUX Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

4. Salvar los cambios al archivo y mostrar los cambios realizados usando sed s//gpw

En este próximo ejemplo, la sustitución se realizará con tres FLAGS. Voy a sustituir todas las ocurrencias de “Linux-Unix” a “GNU/Linux”, mostrar los cambios y también grabar esos mismos cambios en otro archivo temporal.

user@computer:$ sed -n "s/Linux-Unix/GNU\-Linux/gpw archivo-temporal" sed-prueba.txt
1. Administracion GNU-Linux, Unix, GNU-Linux Scriting, etc.
4. Almacenamiento en GNU-Linux, etc

5. Sustituir sólo cuando la línea coincide con el patrón usando sed

En este ejemplo, sí la línea coincide con el patrón “-” entonces reemplazaré todos los caracteres desde el  “-”  y dejarlo en blanco.

user@computer:$ sed "/\-/s/\-.*//g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux
2. Databases
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux
5. Windows

Ahora haré otro ejemplo parecido, eliminando sólo el patrón “-”.  Aprecie la diferencia en la sintaxis.

user@computer:$ sed "/\-/s/\-/ /g" sed-prueba.txt
# Guia de instrucciones
1. Administracion Linux Unix, Unix, Linux Unix Scriting, etc.
2. Databases   Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux Unix, etc
5. Windows  Sysadmin, reboot etc.

6. Eliminar N número de caracteres en cada línea usando sed

Este ejemplo eliminará los últimos 3 caracteres de cada línea.

user@computer:$ sed "s/...$//" sed-prueba.txt
# Guia de instruccio
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, e
2. Databases - Oracle, mySQL, e
3. Seguridad: Firewall, iptables, PF, e
4. Almacenamiento en Linux-Unix,
5. Windows- Sysadmin, reboot e

7. Eliminar el comentario usando sed

Eliminar todas las líneas de comentarios de un archivo.

user@computer:$ sed -e "s/#.*//" sed-prueba.txt
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

8. Eliminar Comentarios y Líneas vacías usando sed

En este ejemplo, hay dos comando separados por “;”

  • El primer comando reemplaza la línea comenzando con el caracter “#” a línea en blanco.
  • El segundo comando elimina las líneas vacías.
user@computer:$ sed -e "s/#.*//;/^$/d" sed-prueba.txt
1. Administracion Linux-Unix, Unix, Linux-Unix Scriting, etc.
2. Databases - Oracle, mySQL, etc.
3. Seguridad: Firewall, iptables, PF, etc.
4. Almacenamiento en Linux-Unix, etc
5. Windows- Sysadmin, reboot etc.

9. Eliminar etiquetas HTML de un archivo usando sed

Usaré otro archivo como ejemplo:

user@computer:$ cat prueba.html
<li>sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.</li>
<li>El nombre <strong>Sed</strong> es una abreviación para <strong>s</strong>tream <strong>ed</strong>itor y su utilidad se deriva de los comando del editor de línea <strong>ed</strong>.  (<strong>ed</strong> fue el primer editor en UNIX).</li>
<li>Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con <strong>vi</strong> o <strong>emacs</strong>.</li>
<li><strong>sed</strong> lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.</li>
</ul>

Con este ejemplo, la expresión regular dada en el comando sed busca la líneas que coincida con las etiquetas HTML y reemplaza con caracteres en blanco.

user@computer:$ sed -e "s/<[^>]*>//g" prueba.html
sed es un editor  “no-interactivo” orientado a flujo. Ya que no es interactivo puede usar para automatizar ediciones.
El nombre Sed es una abreviación para stream editor y su utilidad se deriva de los comando del editor de línea ed.  (ed fue el primer editor en UNIX).
Esta característica  permite editar mútiples archivos o realizar operaciones comunes de edición de texto sin necesidad de abrir el archivo con vi o emacs.
sed lee desde el archivo o desde la consola y su salida se direcciona hacia la salida estandar.

Trabajo a diario en una consola de comandos, y en situaciones de contigencia donde lo importante es dar con una solución inmediata lo preciso es hacer un pequeño cambio y ya…  Evito abrir el archivo. Sencillamente quiero cambiar algo dentro de un archivo de configuración y reiniciar el servicio.

Seguir leyendo» Sin comentarios

History con fecha y hora

Categoría(s): Debian, FreeBSD, GNU/Linux, Línea de comandos, Mac OS X, UNIX

screenshot-willtaichi

Cuando trabajamos en la línea de comandos de UNIX o Linux,  regularmente, revisamos cuales comandos se han ejecutado de esta manera;

user@computer:$ history

Ah..! -pero si quiero saber exactamente la  hora y fecha de ejecución, entonces lo que necesito es activar esta variable de entorno con algunos parámetros;

user@computer:$ export HISTTIMEFORMAT='%F %T '

Seguir leyendo» Sin comentarios