Monthly Archives: January 2011

Paquetes non-free en Debian

Buscando por ahí me encontré con el siguiente comando.

vrms

Que muestra un listado de los paquetes non-free (no libres, codigo propietario, binarios cerrados, etc). En la página de manual, explican que es un intento de concienciar de lo “malo” que es el uso de este tipo de software en los sistemas GNU/Linux para empezar porque es una contradicción con el contrato social de Debian. Pero que es tolerado porque hace que algunas cosas funcionen… La página de manual está en inglés pero también los explican en la Wikipedia.

Aquí una captura del funcionamiento.

vrms

vrms

En mi caso de casi 2000 paquetes instalados sólo son propietarios el 0.05% que creo que es poco o muy poco.

Utilizando ficheros de configuración en los scripts de Bash

En algunas ocasiones tal vez necesites crear un script de Bash para resolver algunas tareas y que utilice un fichero de configuración. ¿Cómo lo plantearías? ¿Cómo implementarías el fichero de configuración?

Lo primero que pensé fue en utilizar el comando cut de forma que el fichero de configuración tuviera un formato de etiqueta=valor, y podría “cortar” para leer la etiqueta y el valor. Pero es mala cosa, porque por cada línea del fichero de configuración tienes que cortar y luego saber qué etiqueta es. La mejor solución, el comando source

Suponemos un fichero de configuración config.ini como este:

PATTERN="$hello*"
FILENAME=hello.txt
OUTPUT=result.txt

Y queremos que nuestro script lea estas variables y ejecute grep

#!/bin/bash
source config.ini

grep ${PATTERN} ${FILENAME} > ${OUTPUT}

El comando source importara todas las variables del fichero de configuración config.ini en nuestro script y prodremos utilizarlas para lanzar grep. También podemos sustituir el comando source por un . (un punto) así:

. config.ini

También podemos importar otros script con sentencias de control (if-else) pero hay que tener cuidado porque si el script que importamos contiene el comando exit el programa finalizará en ese punto. Por ejemplo, importamos el siguente trozo de código:

config.sh

#!/bin/bash
HELLO=world
exit

Y lo utilizamos en este:

parent.sh

#!/bin/bash
source config.sh
echo ${HELLO}

Cuando lanzamos el script ./parent.sh terminará antes de llegar a la línea de echo porque ha leído el exit

Espero que este pequeño truco os de una idea de como utilizar el comando source para importar fichero de configuración dentro de vuestros scripts

Es una traducción de este truco en linux.byexamples.com

Aumentar el espacio de RAID cambiando los discos

Estabamos a punto de quedarnos sin espacio en uno de los servidores de copias de seguridad, debiamos actuar en consecuencia, pero teníamos un problema. No había más puertos SATA para pinchar discos, teníamos pinchados 4 discos de 1TB para formar el array, la solución que inventamos fue cambiar los discos por discos de 2TB. Pero sólo había dinero para dos discos, luego mantendríamos 2 discos de 1TB y le añadiríamos dos discos más de 2TB. Veamos como se hace.

La solución consiste en eliminar 1 disco y añadir otro para sustituir los discos y añadir luego las dos particiones nuevas para aumentar el espacio.

Para el ejemplo disponemos de particiones de 10MB en una Debian 5.0.3. Partimos de la siguiente configuración:

/dev/md0:
        Version : 00.90
  Creation Time : Sat Jan 15 21:28:39 2011
     Raid Level : raid5
     Array Size : 29952 (29.25 MiB 30.67 MB)
  Used Dev Size : 9984 (9.75 MiB 10.22 MB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sat Jan 15 21:28:39 2011
          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : dfbcb5a6:fd376e03:9efbd2b1:7507133b
         Events : 0.1

    Number   Major   Minor   RaidDevice State
       0      22        1        0      active sync   /dev/hda
       1      22        2        1      active sync   /dev/hdb
       2      22        3        2      active sync   /dev/hdc
       4      22        4        3      active sync   /dev/hdd

A continuación marcamos como fallido y elimininamos hdc así:

# mdadm --fail /dev/md0 /dev/hdc
# mdadm --remove /dev/md0 /dev/hdc

Abrimos la máquina y cambiamos el disco, creamos un par de particiones de 1TB cada una del tipo fd (Linux Raid Autodetect). Cuando tengamos esto, añadimos la primera partición al raid.

# mdadm --add /dev/md0 /dev/sda1

Y vemos como se reconstruye el Raid que dependiendo del caso puede tardar varias horas.

Una vez el raid se ha reconstruido, eliminamos otro disco, hdd como hemos hecho anteriormente, apagamos para sacar el disco y añadir el nuevo disco que será el que amplie el tamaño.

Cuando ya hemos cambiado los discos y añadido las particiones de uno de ellos al Raid estamos como al principio pero disponemos de otro disco, el cual particionamos como el anterior así:

# sfdisk -d /dev/sda | sfdisk /dev/sdb

Ahora añadimos las nuevas particiones al array

# mdadm --add /dev/md0 /dev/sdb1
# mdadm --add /dev/md0 /dev/sdb2

Estos discos se añaden como Spare (reserva) para decirle que los use hacemos lo siguiente:

# mdadm --grow /dev/md0 --raid-devices=6

Y tras la operación de crecimiento veremos esto

/dev/md0:
        Version : 00.90
  Creation Time : Sat Jan 15 20:51:15 2011
     Raid Level : raid5
     Array Size : 49920 (48.76 MiB 51.12 MB)
  Used Dev Size : 9984 (9.75 MiB 10.22 MB)
   Raid Devices : 6
  Total Devices : 6
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sat Jan 15 20:59:48 2011
          State : clean
 Active Devices : 6
Working Devices : 6
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : caf96b94:b704eba2:86b20519:591dba3f
         Events : 0.54

    Number   Major   Minor   RaidDevice State
       0      22        1        0      active sync   /dev/hda
       1      22        2        1      active sync   /dev/hdb
       2      22       66        2      active sync   /dev/sda1
       3      22       65        3      active sync   /dev/sda2
       4      22       68        4      active sync   /dev/sdb1
       5      22       67        5      active sync   /dev/sdb2

Como vemos en la salida del comando hemos crecido en 20MB (en el servidor autentico eran 1.5TB más), ahora toca decirselo al sistema de ficheros, para esto pasamos primero un test a la integridad y luego ampliamos el tamaño.

fsck.ext3 /dev/md0
resize2fs /dev/md0

Es un proceso lento (muy lento) dependiendo del tamaño. Hay que tener cuidado, cuando se sobrepasan los 2TB las tablas de particiones no pueden ser MSDOS.