lunes, 8 de julio de 2013

Tutorial: Restaurar una unidad de RAID con un disco de menor capacidad.

Hace mucho que no escribo, así que decidí agregar un artículo técnico que le dé algo de valor a este intento de blog, haciendo que no parezca abandonado. Acá les dejo un nuevo tutorial entonces. Disfrútenlo.


Siempre que instalo un servidor me gusta poder utilizar hardware de buena calidad, aunque a veces los clientes quieren aprovechar equipamiento que no puede utilizarse con la última versión de ese conocido "sistema operativo de escritorio que ahora pretende convertir un PC en un celular" (practicamente cualquier cosa fabricada antes del 2008), lo cual muchas veces lleva a que se trabaje con equipamiento de cierta edad y/o de confiabilidad dudosa, y en algunos casos cuya obsolescencia representa un riesgo a corto o mediano plazo, dado que es dificil encontrar piezas de reemplazo para efectuar reparaciones básicas y mantener su ciclo de funcionamiento más allá del ya definido por el fabricante.

Supongo que siendo que en Uruguay no se fabrican computadoras ni componentes, no es dificil de entender que todos queramos que nuestro hardware supere su expectativa de vida, limitada por la obsolescencia planificada a la que es sometido por los fabricantes...

Independientemente de la calidad del hardware disponible, siempre exijo que se cumplan ciertos requisitos que disminuyen la probabilidad de fallos terminales en los equipos, como por ejemplo unidades de disco redundantes (RAID).

A pesar de mis intentos de obtener lo que considero esencial siempre, con frecuencia sucede que cuando me dan los equipos para comenzar la instalación, alguien olvidó agregare el disco adicional para armar el RAID, con lo cual a veces se generan esperas innecesarias. En ese caso, suelo crear las unidades de RAID por software en forma independiente a la instalación, e instalar luego, haciendole creer al sistema que está usando una unidad de RAID degradada. Eso me permite instalar el servidor sin esperas, y luego solo agregarle el disco faltante reconstruyendo las unidades de RAID cuando las condiciones así lo permitan (muchas veces estando los servidores en producción).

Para crear las unidades de RAID antes de instalar el sistema operativo, simplemente se carga un CD/DVD de rescate, se crean las particiones y luego se crean las unidades de RAID necesarias con la herramienta mdadm:
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda2 missing
Esta línea de comandos permite crear una unidad de RAID de nivel 1 por software, formado por dos unidades de disco (en realidad, formado por particiones de los discos), pero declarando la segunda partición como "no existente". De esa forma, aseguramos la creación de la unidad de RAID sin necesidad de tener los dos discos duros instalados.

Una vez que vamos a instalar el sistema operativo, lo único que tenemos que tener en cuenta es que utilizaremos como particiones las unidades de RAID creadas (sean cuantas sean). Cuando recibimos el disco faltante, simplemente lo particionamos y reconstruimos las unidades de RAID para que las mismas queden en el estado de consistencia que las hace útiles. Si no recibimos el otro disco duro, simplemente podemos dejar el servidor con las unidades degradadas, aunque obviamente la falta de redundancia hará que cualquier fallo físico en el único disco que el servidor tiene sea fatal para el sistema, o por lo menos, genere un downtime no programado, algo que no es precisamente apreciado por clientes y usuarios.

Hace unos días tuve que instalar un servidor que había traído un único disco duro de 80 GB (específicamente un Western Digital WDC WD800BD-22JM, de exactamente 80.026.361.856 de bytes de espacio disponible).

Decidí no esperar por el segundo disco, así que particioné el disco e instalé el sistema operativo, usando la técnica de creación de unidades de RAID L1 por software manualmente. Esta técnica dejó el sistema con este "layout":
srv:~ # fdisk -l
Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156301488 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x4e3acf1a

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     8800255     4194304   fd  Linux raid autodetect
/dev/sda3         8800256   156301487    73750616   fd  Linux raid autodetect
La primera partición la uso para el /boot (cerca de 200MB), y las otras las utilizo como particiones origen para crear dos unidades de RAID separadas, una para el raiz del sistema (75 GB)y la otra como SWAP (4 GB).

Las unidades de RAID, una vez creadas, son estas:
srv:~ # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sda3[0]
      73749520 blocks super 1.2 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md1 : active raid1 sda2[0]
      4193268 blocks super 1.2 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: 
srv:~ #
Todo estaba perfecto, hasta que recibí el segundo disco... un Hitachi HDS728080PLA380 (de 80.000.000.000 de bytes de capacidad).

Esto representa un verdadero problema, dado que más allá de las obvias diferencias de marca y modelo, hay una diferencia significativa en la capacidad del disco, lo cual afecta la viabilidad del proceso de reconstrucción. Hacen falta 26361856 de bytes para poder considerar usar ese disco como destino de las unidades de RAID, y mantener el mismo exacto layout, como debería ser el caso ideal.

Otro detalle que cabe tomar en cuenta es que al ser distintos los discos, la performance se podría ver afectada por la diferencia de velocidades de acceso, lectura, escritura y búsqueda entre los discos, sin contar con el ancho de banda y la capacidad de los buffers. Básicamente, al igual que en una red donde participan dos dispositivos con diferentes capacidades de transferencia, el más lento es el que establece los niveles máximos alcanzables, así que la performance global dependerá, obviamente, del disco más lento.

Como prueba base para saber cual de los dos discos es el más lento (suponiendo que eso fuera realmente una condición determinante), se puede usar la herramienta hdparm:
srv:~ # hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   5322 MB in  2.00 seconds = 2663.04 MB/sec
 Timing buffered disk reads: 174 MB in  3.02 seconds =  57.65 MB/sec
srv:~ # hdparm -tT /dev/sdb

/dev/sdb:
 Timing cached reads:   5308 MB in  2.00 seconds = 2656.07 MB/sec
 Timing buffered disk reads: 168 MB in  3.03 seconds =  55.49 MB/sec
srv:~ #
Como puede verse, existe una leve diferencia en la velocidad de transferencia, aunque no es tan grave como para ser un factor determinante en cuanto a la viabilidad del disco en sí, o sea que el problema se reduciría solo a la diferencia de capacidad.

Debe notarse que el problema de la diferencia de tamaños en los discos no sería tan importante si se hubiera utilizado LVM, cosa que no se hizo dado que el servicio que este equipo provée es el de interconexión de redes (se trata de un router con capacidades avanzadas de firewalling) y no se espera que el esquema de particionamiento o las necesidades de almacenamiento cambien en el tiempo. LVM provée flexibilidad en el uso de las unidades de almacenamiento, pero para un equipo cuyo sistema de almacenamiento no va a cambiar, no es extremadamente necesario utilizarlo.

Llegado a este punto, pude simplemente descartar el disco y pedir otro que fuera de mayor capacidad, pero preferí hacer de este problema una oportunidad educativa para mi y para otros, así que decidí elaborar un procedimiento que me permitiera utilizar este disco de todas maneras.

ADVERTENCIA: El procedimiento que está a punto de leer asume que el operador tiene sólidos conocimientos técnicos sobre el uso de ciertas herramientas que pueden ser peligrosas para el sistema en caso de un error inadvertido. Niños, no lo hagan en sus casas sin la compañía, el consejo o (cómo mínimo) el teléfono de un sysadmin hábil a mano... y por sobre todas las cosas, si meten la pata, ¡no sucumban al pánico!

Las reglas que decidí que regirían el procedimiento son las siguientes:
  1. Siendo que el servidor está en producción, el procedimiento debe realizarse sin afectar el servicio que el mismo provee.
  2. Como el disco principal es mayor que el nuevo disco, es imperativo modificar el formato de las particiones del disco principal para organizar el espacio disponible y que las particiones queden iguales en los dos discos. Esto ademas proveerá elegancia a la solución, dado que el formato de las particiones quedará lo más parecido posible.
  3. El procedimiento debe poder ser ejecutado en forma remota, de manera de poder ser realizado en cualquier horario, sin representar un problema para mi o para el cliente.
Como el servidor está en producción, no es posible disminuir el tamaño de la partición raiz del sistema para que quede igual al espacio que tendría la partición correlativa del segundo disco (que sería la solución más simple), así que decidí modificar la partición que correspondería a la unidad RAID asignada al SWAP (/dev/md1, la cual utiliza la partición /dev/sda2), haciendo que su tamaño disminuya como para poder compensar la diferencia de tamaño entre los discos y permitir crear una partición en el disco /dev/sdb de tamaño suficiente como para ser capaz de asignarse a /dev/md0, permitiendo la reconstrucción de la unidad.

El procedimiento detallado sería este:

  1. Crear un archivo de SWAP capaz de compensar la falta que hará la desactivación de la unidad de RAID de 4 GB asignada al SWAP actualmente (/dev/md1).
  2. Activar el archivo de SWAP y desactivar el SWAP al que está asociada la unidad /dev/md1.
  3. Desactivar la unidad /dev/md1, para poder modificar el formato de las particiones del disco /dev/sda.
  4. Hacer el cálculo de cual sería la posición (sector del disco) en la que debería terminar la partición /dev/sda2 para permitir la creación de las particiones /dev/sdb2 y /dev/sdb3 con un tamaño apropiado para ser utilizadas como particiones integrantes de las unidades /dev/md1 y /dev/md0 respectivamente.
  5. Eliminar la partición /dev/sda2.
  6. Crear la partición /dev/sda2, con el nuevo tamaño calculado. Esto dejaría un espacio "libre" entre el final de la partición /dev/sda2 y el inicio de /dev/sda3, el cual será igual a la cantidad de bytes faltantes en el disco /dev/sdb para llegar al tamaño de /dev/sda.
  7. Crear las particiones correlativas en el disco /dev/sdb
  8. Crear la nueva unidad de RAID /dev/md1.
  9. Configurar /dev/md1 como SWAP nuevamente.
  10. Insertar la partición /dev/sdb3 en la unidad de RAID /dev/md0, reconstruyendo la partición y obteniendo como resultado final la redundancia que se espera que un sistema como este tenga.
Habiendo definido entonces el procedimiento, ponemos manos a la obra. Todo el proceso lo ejecuté conectado vía SSH al sistema, en forma remota. Cabe notar que he coloreado en amarillo los comandos que ejecuté, de forma de facilitar la lectura:

1) Crear un archivo de SWAP

Primero verificamos el tamaño actual del SWAP y el uso que el sistema le está dando:
srv:~ # free
             total       used       free     shared    buffers     cached
Mem:       2052948    1392436     660512          0     128200     788968
-/+ buffers/cache:     475268    1577680
Swap:      4193264     356468    3836796
Como puede verse, hay poco uso de SWAP, aunque no es despreciable, así que no va a haber necesidad de que el sistema "transvase" demasiada información desde el SWAP actual al nuevo archivo que crearemos una vez que lo configuremos. Debe considerarse que un sistema en producción jamás debe quedar sin SWAP, aunque en un momento dado se observe que el mismo no lo está utilizando.

Creamos el archivo que utilizaremos como SWAP momentáneamente. Para este caso en particular, viendo que no se estaba utilizando la totalidad del SWAP, lo hacemos de 2G de capacidad. Adicionalmente, lo formateamos como tal:
srv:~ # dd if=/dev/zero of=/swap.dat bs=2G count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB) copied, 155.499 s, 13.8 MB/s
srv:~ # mkswap /swap.dat
Setting up swapspace version 1, size = 2097144 KiB
no label, UUID=12105ad3-d781-478f-a967-d1597b92ea78

2) Activacion del SWAP del archivo y desactivación del SWAP provisto por la unidad /dev/md1

srv:~ # swapon /swap.dat
srv:~ # free
             total       used       free     shared    buffers     cached
Mem:       2052948     560468    1492480          0       3388     482876
-/+ buffers/cache:      74204    1978744
Swap:      6290408     356468    5933940
Llegados a este punto, podemos desasociar la unidad de RAID /dev/md1 del SWAP:
srv:~ # swapoff /dev/md1
srv:~ # free
             total       used       free     shared    buffers     cached
Mem:       2052948     890400    1162548          0       3448     458016
-/+ buffers/cache:     428936    1624012
Swap:      2097144          0    2097144
srv:~ #
Ahora que liberamos la unidad de RAID, podemos trabajar tranquilos de que no hay ningún proceso en el sistema que la esté utilizando.

4) Desactivar la unidad /dev/md1

srv:~ # mdadm -S /dev/md1
mdadm: stopped /dev/md1
srv:~ # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sda3[0]
      73749520 blocks super 1.2 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: 
srv:~ #
En este momento, solo quedó activa la unidad /dev/md0, la cual contiene el sistema raiz, el cual no debe ser perturbado de ninguna forma, dado que el funcionamiento del sistema depende de ello.

3) Cálculo del tamaño (y posición de comienzo y final) de la partición /dev/sda2

Una vez desactivada la unidad correspondiente, podemos hacer el cálculo del tamaño que tendría que tener la partición correspondiente a esta unidad para compensar la diferencia de espacio que falta en el disco /dev/sdb, para poder crear luego las particiones /dev/sdb2 y /dev/sdb3, y que específicamente /dev/sdb3 tenga el mismo exacto tamaño que /dev/sda3, condición indispensable para que sea posible reconstruir /dev/md0. Es cuestión de aplicar las matemáticas para obtener el resultado.

El tamaño de la partición /dev/sda3 es de 147501231 sectores (73750616 bloques), y suponiendo que intentásemos crear la partición /dev/sdb3 con el espacio que nos queda después de crear las particiones /dev/sdb1 y /dev/sdb2 (idénticas a sus correlativas en /dev/sda), dicha partición nos quedaría de 147449743 sectores (73724872 bloques), lo cual nos dá una diferencia de 51488 sectores (25745 bloques) con respecto al tamaño de /dev/sda3. Entonces, si disminuímos el tamaño de la partición /dev/sda2 en 51488 sectores, debería quedarnos suficiente espacio para que fuera posible crear las particiones /dev/sdb2 y /dev/sdb3 con exactamente las mismas características que las particiones /dev/sda2 y /dev/sda3.

Si bien podríamos tomarnos la molestia de usar un programa de cambio de tamaño de particiones (como gpart), en este caso vamos a decantarnos por eliminar la partición /dev/sda2 y crearla de nuevo con el nuevo tamaño calculado (8337119 sectores, obtenido al restarle 51488 sectores al tamaño de la partición original, la cual finaliza en el sector 8800255). De estas operaciones obtenemos la nueva posición del extremo final de la partición, en el sector 8748767.

5) Eliminación de la partición /dev/sda2

La operación entonces se reduce primero a eliminar la partición /dev/sda2 anterior con fdisk:
srv:~ # fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 2

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

srv:~ #
Obsérvese que aparece una advertencia al grabar la nueva tabla de particiones. Esto es normal para un sistema en producción y no debe producir pánico. Ejecutar partprobe o kpartx no resuelve el problema, dado que las particiones siguen en uso. Lo único que "resuelve" este "problema" es un simple reboot, que podrá ser ejecutado cuando el momento sea apropiado. A los efectos de mantener el funcionamiento normal del servidor, esta advertencia puede perfectamente ser ignorada sin consecuencias de ningún tipo durante todo el tiempo que sea necesario.

6) Creación de la nueva partición /dev/sda2 con el tamaño apropiado.

Posteriormente a crear la partición /dev/sda2 de esta manera:
srv:~ # fdisk /dev/sda
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 2):
Using default value 2
First sector (411648-156249999, default 411648):
Using default value 411648
Last sector, +sectors or +size{K,M,G} (411648-156249999): 8748767

Command (m for help):
Nótese que usamos el valor 8748767 para indicar cual es el sector final de la partición. Pudimos también especificar el tamaño de la partición en sectores, indicando el valor que calculamos anteriormente y anteponiéndole un signo de "+": +8337119. Cualquiera de las dos formas son válidas.

7) Creación de las particiones necesarias en /dev/sdb

srv:~ # fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders, total 156250000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-156249999, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-156249999, default 156249999): 411647

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 2): 2
First sector (411648-156249999, default 411648):
Using default value 411648
Last sector, +sectors or +size{K,M,G}(411648-156249999): 8748767

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 3): 3
First sector (8748768-156249999, default 8748768):
Using default value 8748768
Last sector, +sectors or +size{K,M,G} (8748768-156249999, default 156249999):
Using default value 156249999

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): p

Disk /dev/sdb: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders, total 156250000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      411647      204800   83  Linux
/dev/sdb2          411648     8748767     4168560   fd  Linux raid autodetect
/dev/sdb3         8748768   156249999    73750616   fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
srv:~ #
En el proceso debe notarse que el tipo asignado a las particiones que formarán parte de las unidades de RAID fueron declarados como "fd" (Linux raid autodetect). También se puede observar que la partición /dev/sdb3 tiene exactamente 73750616 bloques (que era nuestro objetivo principal), y la partición /dev/sdb2 tiene exactamente 4168560 bloques, lo cual indica que los cálculos fueron correctos.

8) Crear la nueva unidad de RAID /dev/md1.

Llegados a este punto podemos crear nuevamente la unidad de RAID que desactivamos anteriormente, con el propósito de manipular los tamaños y las posiciones en los discos. Esta es una tarea simple, usando mdadm:
srv:~ # mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2
mdadm: /dev/sda2 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Fri Jun 21 16:11:35 2013
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: /dev/sdb2 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Fri Jun 21 16:11:35 2013
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
srv:~ # 
Como puede observarse, aparece una advertencia, dado que la partición /dev/sda2 cree pertenecer a una unidad de RAID previa (lo cual es cierto). Podemos ignorar esta advertencia sin problema, porque sabemos que esta partición formaba parte de la unidad original y no correremos riesgos recreandola, así que la respuesta correcta a la pregunta "Continue creating array?" es presionar la tecla "y".

A continuación verificamos que la unidad se creó correctamente:

srv:~ # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md1 : active raid1 sdb2[1] sda2[0]
      4167524 blocks super 1.2 [2/2] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk
      [>....................]  resync =  4.6% (193792/4167524) finish=1.0min speed=64597K/sec

md0 : active raid1 sda3[0]
      73749520 blocks super 1.2 [2/1] [U_]
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: 
Aquí podemos apreciar que la unidad fué inicializada correctamente y que comenzó el proceso de reconstrucción.

Como el proceso se lleva a cabo en forma totalmente independiente del funcionamiento del sistema, podemos seguir con el procedimiento sin esperar que haya problemas de importancia. La sincronización llevará un tiempo, pero no es necesario desperdiciar ese tiempo esperando a que el sistema termine de ejecutarlo.

9) Configurar /dev/md1 como SWAP nuevamente.

srv:~ # mkswap -f /dev/md1
Setting up swapspace version 1, size = 4167520 KiB
no label, UUID=1b6613f9-dd0b-42ab-bfe7-b9cf8fb385e8

srv:~ # swapon /dev/md1
srv:~ #
Ya habiendo activado la unidad de RAID en el SWAP, podemos desactivar el archivo de SWAP que creamos originalmente y eliminarlo.

srv:~ # swapoff /swap.dat
srv:~ # rm -f /swap.dat
srv:~ #

10) Insertar la partición /dev/sdb3 en la unidad de RAID /dev/md0

srv:~ # mdadm --add /dev/md0 /dev/sdb3
mdadm: added /dev/sdb3
srv:~ # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md1 : active raid1 sdb2[1] sda2[0]
      4167524 blocks super 1.2 [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md0 : active raid1 sdb3[2] sda3[0]
      73749520 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  0.2% (194560/73749520) finish=31.5min speed=38912K/sec
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: 
srv:~ # 
Llegado este punto, podemos decir que el procedimiento ha concluído con éxito. Si el tamaño de la partición /dev/sdb3 fuera inapropiado, mdadm no permitiría su inclusión en la unidad de RAID, con lo cual este procedimiento hubiera sido en vano.

Ahora solo cabe esperar que la unidad /dev/md0 se reconstruya, proceso que puede si bien se estima que puede tardar una media hora, puede tardar mucho más que eso. Y una vez terminado, las unidades quedarán así:

srv:~ # cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md1 : active raid1 sdb2[1] sda2[0]
      4167524 blocks super 1.2 [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

md0 : active raid1 sda3[2] sdb3[0]
      73749520 blocks super 1.2 [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

unused devices: 

Conclusión.

En definitiva, el procedimiento cumplió con los objetivos y con las reglas que lo rigeron. No hubo downtime, y la manipulación de las particiones y unidades no representó un riesgo significativo para el funcionamiento del sistema en ningún momento.

Cabe agregar que si bien es muy posible que este procedimiento haya sido una solución muy específica para un caso muy puntual, esto no significa que no presente un punto de vista distinto e interesante a tomar en cuenta cuando se nos presenta una situación fuera de lo común, con dificultades adicionales que lo hacen más entretenido aún (como por ejemplo que se deba hacer remotamente, que el servidor permanezca en producción, etc.).

Adicionalmente a este procedimiento que podríamos dar "por terminado" (y para completar como es debido este tutorial), deberían tomarse los recaudos del caso y copiarse el contenido de la partición montada en /boot (/dev/sda1) en /dev/sdb1 y asegurarse que el sistema puede bootear de ese disco en forma independiente de la existencia del otro (una de las razones por las cuales suelo instalar los discos de esta manera), así que ejecutamos algunos comandos más y ya dejamos todo como debe ser:

srv:~ # dd if=/dev/sda1 of=/dev/sdb1
409600+0 records in
409600+0 records out
209715200 bytes (210 MB) copied, 13.7615 s, 15.2 MB/s
srv:~ # fsck -f /dev/sdb1
fsck from util-linux 2.19
e2fsck 1.41.14 (22-Dec-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 46/51200 files (10.9% non-contiguous), 35815/204800 blocks

srv:~ # grub

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub> find /boot/grub/stage1
 (hd0,0)
 (hd1,0)

grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+17 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub> exit
Con estos comandos, copiamos la partición /dev/sda1 sobre /dev/sdb1, asegurando que son exactamente iguales, pasamos un fsck para verificar que el filesystem contenido en /dev/sdb1 está en buenas condiciones, y por último ejecutamos GRUB para configurar el MBR en el disco /dev/sdb y asegurar así que va a ser capaz de bootear, independientemente de que el disco /dev/sda esté presente.

Por último, ejecutamos un nuevo scan de las unidades de RAID para actualizar el archivo /etc/mdadm.conf y listo.

srv:~ # echo "DEVICE containers partitions" > /etc/mdadm.conf
srv:~ # mdadm --detail --scan >> /etc/mdadm.conf
srv:~ # cat /etc/mdadm.conf
DEVICE containers partitions
ARRAY /dev/md0 metadata=1.2 name=srv:0 UUID=70578b13:6c3c1bc1:ace1d531:78764029
ARRAY /dev/md1 metadata=1.2 name=srv:1 UUID=4920c932:ddd10dfe:b97b79b8:5275b4a5

Como les dije antes, esta "solución" podría ser muy específica, pero espero que quienes lleguen a este artículo lo consideren como lo que es realmente, un punto de vista diferente y una solución alternativa a un problema relativamente infrecuente, y además le encuentren algo de utilidad.

Pido disculpas por lo extenso del artículo, pero me pareció interesante publicarlo de la forma más detallada posible para evitar errores que puedan hacer de un entretenido procedimiento, una pesadilla. Espero que sea de provecho para quienes visiten este aburrido rincón de Internet... :-)

:wq

martes, 30 de octubre de 2012

Hasta siempre, abuelo.



  Se fué mi abuelo.

  Se fué mientras estaba con el, acompañándolo en la emergencia de la sociedad médica, esperando verlo despertar para después, en algún momento, llevarlo de nuevo a casa. La suerte o el destino quiso que se fuera sin dolor, sin sufrimiento y sin pena. Se dejó llevar, cansado de la vida y de su cuerpo, cada vez más dificil de tener en pié.

  Me tomó por sorpresa el momento de su partida y no me dió tiempo a pensar o sentir nada. No pude reaccionar de ninguna forma. Cuando el médico se apartó de la camilla y se acercó para decirme lo que yo ya sabía, era evidente que la realidad todavía no me había golpeado como lo hizo un momento después.

  Me quedó grabado lo que repitió tantas veces en los días previos, que el se quería "ir", que ya había sido suficiente, que había vivido bien y que no quería seguir siendo "una molestia". ¿Como iba a ser una molestia realmente, si el había estado yendo y viniendo por si solo y decidiendo sobre su vida como si nada pasara, como si todavía tuviera mi edad? ¿Acaso se privaba de tomarse su whisky o fumarse su cigarrillo, o andaba pidiendo ayuda para todo? Por supuesto que no. ¿No se había ganado acaso el derecho de enojarse por lo que quisiera o reírse de lo que fuera? Claro que sí.

  Molestia hubiera sido si nadie lo hubiera querido, pero ninguno de los que quedamos acá después de que se fué lo quería poco, sino todo lo contrario.

  Desde mis adentros, ardió el dolor de la pérdida, de la desoladora confirmación de que ya no volvería a verlo de nuevo, y desde ese momento el mundo ya no volvió a ser el mismo. Hubiera querido decirle tantas cosas, compartir tanto más con él, pero ya no había tiempo. Ya hacía meses que se había entregado, había dejado de comer, de cuidarse, de tomar sus medicamentos. Visitaba a la cardióloga porque lo llevábamos prácticamente obligado. La última vez se negaba a ir, y luego de un rato de conversarlo, me mostró que era porque ya no podía calzarse y eso lo enloquecía. Para alguien que tiene una vida de ir y venir, activa y vibrante, no poder hacer eso que cualquiera hace todos los días era un suplicio. Lo ayudé a calzarse y le dije que lo tomara como un paseo y que íbamos a pasar por el Parque Rodó a comprar unos churros, que tanto le gustaban. Se lo veía cansado, abatido y no dejaba de repetir que "ya no servía para nada". De todas maneras no se privó de hacerle el clásico chiste del gusanito en el vaso de alcohol a la doctora, como siempre que iba. Me dolía verlo así, y yo sabía que el momento estaba cerca, pero no quería aceptar que el día llegaría tan pronto. Cuando tuviste una vida como la de él, en la que muy pocas cosas te quedaron pendientes, ya diste todo de vos y recibiste tanto amor y cariño, ya no hacía falta nada más.


  Me quedaron recuerdos imborrables, detalles que no voy a olvidar. Algunos son vagos instantes de mi niñez, otros son las historias que él contaba, pero todo lo tengo presente. Me acuerdo como en un sueño de como salíamos a caminar tomados de la mano y me "enseñaba a hablar" usando todo un repertorio digno de Jorge Corona. O cuando me sacó del agua aquella vez en que una ola me tapó en Cuchilla Alta e hizo que me diera cuenta de lo peligroso que puede ser el mar cuando tenés apenas tres años y medís medio metro de altura. O cuando usando algún super-poder que nunca pude entender, detuvo a tiempo aquella hamaca de la que yo me había tirado, antes de que me golpeara en la nuca, seguramente dejándome inconsciente. O cuando nos llevó al Parque Rodó a mi primo y a mi, en la época en que todavía estaba aquel inflable "enorme" en el que te podías meter y saltar como loco, y que ahora cualquiera puede alquilar para el cumpleaños de sus hijos. Me acuerdo de cómo lloré cuando se iban todos juntos a Costa Azul y yo me tenía que quedar en casa porque estaba haciendo fiebre producto de la varicela, y el se acercó a la cama a tratar de tranquilizarme. Me acuerdo de cuando iba a casa trayendo chocolatines "Águila", de como cada vez que venía a casa era una fiesta, y de cuando nos hacía aquellas tortas de cumpleaños adornadas con fondán de colores que tanto nos gustaba. Me acuerdo de los Ricarditos que repartía cuando íbamos de visita. Me acuerdo de aquella tarde en que en una torpeza mía crucé corriendo y sin mirar hacia los dos lados la Avenida Millán, y un grito de él hizo que me detuviera a escasos centímetros de la trayectoria de un enorme camión que intentaba frentar sin lograrlo. Me acuerdo de cómo me acompañaba para que aprendiera a andar en bicicleta, de los caramelos que me daba todas las noches, de las idas a los juegos del Prado y las visitas al museo Blanes.

  Cuando fui creciendo, me acuerdo de las conversaciones en las que intentaba convencerme de que estudiara y creciera siendo una buena persona, porque según decía, yo era su nieto preferido, un privilegio que nunca merecí pero que llevé con una mezcla de pública vergüenza y secreto orgullo durante toda mi vida. Me acuerdo de cuando me iba a quedar algunos días a su casa y al caer la tarde el me preparaba aquellos sandwiches de pan marsellés, con butifarra y ajíes picantes. Me acuerdo de cuando me llamó emocionado para que fuera a leer una carta de respuesta a una petición de trabajo que él me había incentivado a hacer a un laboratorio, que finalmente resultó ser una carta de rechazo, y de su cara triste y avergonzada a pesar de mis intentos de darle poca importancia al asunto. Me acuerdo de cuando se tomó la  molestia de coleccionar aquel Manual de Windows 98 que salía con el diario "El observador", y que yo no sabía cómo explicarle que parte de mi trabajo consistía en enseñarle a la gente a programar, una tarea para la cual había que saber mucho más de lo que ese manual jamás podía llegar a tener.

  Me acuerdo del taller de relojería, al que él le había puesto el nombre "Diasfi", en honor a un amigo fallecido que se llamaba "Fidias". Recuerdo las tardes que pasamos jugando a la conga "los hombres" contra "las mujeres", y mientras la abuela nos hacía trampa contándose puntos de menos, yo amenazaba con "cortar", y el abuelo cortaba de verdad, dejándome casi siempre con demasiados puntos en la mano. Me acuerdo de las pizzas que hacía cuando íbamos de visita, de las cazuelas de mondongo que organizaba en invierno, de los pasteles hojaldrados y el pan dulce de fin de año.

   No me olvido de lo contento que se quedó cuando fuí a la feria a visitarlo con mi novia, quien ahora es mi mujer y le mostré las alianzas que yo mismo había hecho cuando cumplimos 10 años de noviazgo y de cómo me amenazó de que si dejaba a "Anita" iba a tener lío con él. Me acuerdo de lo orgulloso que estaba cuando pusimos en sus brazos a Valeria, mi primera hija, y de lo feliz que estaba cuando supo que Tatiana, mi segunda hija, había nacido el mismo día de su cumpleaños.

  Me acuerdo de las veces que fuí a su casa y las que vino a la mía, que lamento cada segundo que no hubieran sido más, y como el me palmeaba la espalda y me decía "¡Vos sos mi nieto!", como si no tuviera ninguno más.

  Sabía ser dificil cuando quería, terco e inflexible y no se puede decir que era una persona intachable sin faltar a la verdad. Tenía defectos y debilidades como tenemos todos, pero como sus zapatos me quedan demasiado grandes y no viví todo lo que él vivió, no lo juzgo ni lo reprocho, ni lo haré jamás. Para mí fué todo lo que podía pedir de un abuelo, y yo lo amaba como a nadie más, con un amor de familia que no he sido capaz de sentir siquiera por mis propios padres.

  Aquella mañana lluviosa, el médico salió del box 23 de emergencias de la sociedad, me apartó al pasillo e intentando ser amable, condescendiente y respetuoso, me dijo que era muy dificil que hubiera podido salir adelante, que tenía el corazón muy grande y que no lo había soportado... ¿Cómo no iba a tener un corazón grande si tenía que querer a tanta gente y si todos lo queríamos tanto?.


  La noche anterior a su partida tuve un sueño extraño, que solo le comenté a mi mujer. Soñé que sentado en una silla, maniatado, había alguien (que en el mundo "real", también se fué de esta vida), rodeado de personas que lo juzgaban, como si fuera culpable de algún crimen atroz. Él no hacía nada por defenderse, sino que simplemente aceptaba el castigo que le impondrían, que en el sueño era la muerte. Yo, desesperado ante la dócil sumisión y aceptación del acusado, le pregunté finalmente: "¿Es esto lo que vos querés?", a lo cual él se paró delante de la silla, libre al fin, como si hubiera podido desatarse inmediatamente, me miró directo a los ojos y me dijo sin titubeos "Si". En ese momento todo se terminó, el juicio y las acusaciones, como si hubiera sido una actuación que finalizaba, y yo desperté perplejo y desorientado. No lo entendí en el momento, y me confundieron quienes estaba en el sueño y la situación, pero después de lo que pasó esa mañana, creo haber entendido el verdadero significado, como si hubiera tenido una epifanía. Realmente eso, la muerte, es lo que mi abuelo quería. No era un castigo, era la libertad. Estaba cansado de que lo juzgaran, de que lo acusaran de no tomar los medicamentos, de no comer y de dejarse vencer. Y a pesar de todo, el haber tenido ese sueño me tranquilizó y me ayudo a aceptar la realidad más serenamente, aunque aún ahora no puedo explicarlo de ninguna forma, y quienes me conocen sabrán que para mí es muy dificil aceptar que ese sueño y lo que pasó la mañana siguiente tienen la relación que hoy creo que tienen.

  Y esa fué finalmente la única frase que pude dar y repetir como consuelo a todos los que como yo, lo querían y sufrían. "Es lo que él quería".

  En el velorio, que él también hubiera querido que fuera una fiesta, nos reunimos alrededor de aquel cajón de madera y brindamos con un whisky por él. Mientras apenas pude murmurar un adiós ahogado, no sé de donde sacó entereza mi tío, el hijo que mi abuelo nunca tuvo, para ponerse a cantar y dedicarle una última canción, "De puro curda", y yo me escondía en la cocina para que no me vieran devastado por la emoción y por la bronca, por no saber entera la maldita letra para poder acompañarlo.

  Hoy traté de terminar de escribir este post (cuya finalización hace días que postergo) sin sucumbir a la emoción otra vez, pero no pude. De nuevo se me anudó la garganta y se me nubló la vista por las lágrimas que aún ahora trato de contener, pero no quiero que quede sin terminar esto que es el cierre de una etapa de mi vida que recordaré para siempre con nostalgia, cariño y orgullo.

  Quiero creer que ahora está en una gran fiesta, pasándola bien, disfrutando. El no hubiera querido vernos a todos sufriendo, y menos siendo que terminar de esta forma talvéz fué su decisión. Parecía que me hubiera estado esperando para poder irse tranquilo...

  Donde quiera que estés, abuelo, quiero decirte que aprendí muchas cosas de vos, me enseñaste a ser una mejor persona y que lo realmente importante en esta vida no es tener cosas, sino tener a quien amar y tener a alguien que te ame. Te deseo lo mejor en ese nuevo viaje y quiero que sepas que estoy agradecido de haberte tenido en mi vida todo este tiempo.

  Te quiero y te voy a extrañar mucho.

jueves, 17 de mayo de 2012

Y empezamos otra vez...

Otra vez se "acercan" las elecciones.

Otra vez voy a tener que tomarme la molestia de trasladarme hasta la mesa de votación que me toque, a cumplir con la obligación que me impone la ley. Y otra vez, como muchas otras veces antes, voy a poner papel higiénico en el sobre de votación.

Lo malo no es sólamente que yo tenga que hacerlo, es que muchos otros van a ir a "votar de verdad"...

Como siempre, debo ser yo el que está equivocado, naturalmente. Desde mi punto de vista, ya "probaron" todo lo que había para probar, y ya comprobaron que nada sirve. Entonces ¿porqué siguen convencidos de que votar es una solución viable?

Puedo entender a los militantes, esos personajes que votan "con el corazón", aunque la razón demuestre que en realidad lo que hacen es irracional e injustificado. Los más convencidos votan por "coherencia ideológica" y los otros por fanatismo. Ninguno vota por los resultados obtenidos por el partido en cuanto al bienestar global, que debería ser el verdadero objetivo. El medio se convirtió en más importante que el fin. Ese tipo de votantes son los que todavía creen que los líderes que eligen luchan con ellos y a la par de ellos para mejorar el país. Son gente convencida de que es posible una realidad alternativa y utópica, en la que ellos van a ser considerados como ellos creen que se merecen. Sus ideales son tan importantes que no se dan cuenta de que su fanatismo los tiene ciegos ante una realidad inmutable, basada en reglas que no comprenden del todo, creidos de que cuando sus líderes lleguen al poder, harán lo necesario para cambiarla. No se puede siquiera discutir con ellos, porque han llegado a un punto tal en el que atacan a cualquiera que piense distinto igual que los leucocitos atacan a una enfermedad...

Pues bien, señores militantes, les tengo una noticia: Por si no se dieron cuenta, llevamos casi 30 años de democracia, con participación de los tres principales partidos políticos, y todavía no se resolvieron los principales problemas que nos aquejan desde siempre.

¿Y saben porqué no se resolvió nada? Porque como ya dije antes, nadie va a hacer lo que realmente hay que hacer para resolver los problemas que nos aquejan. Y por eso estoy convencido de que votar no sirve para absolutamente nada. Todo tiene un costo político infranqueable, y nadie va a arriesgarse por la gente que los pone en el poder realmente.

Militar por un partido político hoy día se podría decir que es inmoral, como lo sería defender a un delincuente confeso que no siente ni sentirá nunca ningún arrepentimiento. Es muy probable que muchos de los que militan tengan sus propias agendas también, sus propios intereses, su vista enfocada en una parte de la gran torta que se reparte entre los ganadores. Sino, ¿como puede explicarse que sigan intentando "ganar"? ¿Me van a discutir que es por los principios o por el bienestar de los que están mal? Si este último es el caso, ¿están seguros de que esos objetivos son alcanzables si se asegura y perpetúa la hegemonía del grupo que defienden y que ha demostrado que son tanto o más incompetentes y corruptos que todos los demás?

Los partidos políticos son empresas con su propia agenda, sus propios intereses y sus propias motivaciones, totalmente independientes de lo que sus seguidores creen que representan. Sus líderes salvaguardan y protegen al dios dinero y a sus verdaderos dueños. Un ejemplo claro lo tenemos hoy mismo en nuestro gobierno actual. La izquierda uruguaya se llenó la boca durante cuarenta años con las cosas que iban a hacer cuando estuvieran en el poder, y ahora que están ahí con ámplia mayoría en las cámaras, se "dieron cuenta" como en una epifanía de que no es tan fácil como se lo estuvieron diciendo a sus seguidores durante décadas. Dos períodos de consistencia y continuidad en las cuestiones importantes y solo "mejoras" marginales en algunos otros ámbitos demuestran una hipótesis que era obvia. Sus votantes, ¿no se sienten traicionados acaso?

Seamos realistas. Ya probaron de todo. Todos prometieron y ninguno cumplió. Todos mintieron, abierta y descaradamente, algunos de forma tan incisiva y deliberada que es increíble que aún tengan adeptos (¿Se acuerdan de aquel comercial de radio en el que aparecía Luis Hierro López afirmando "Los colorados, no vamos a devaluar"? ¿O  cuando las primeras elecciones en las que ganó el FA la dirección de la Intendencia de Montevideo con la promesa de Mariano Arana de bajar en un 50% el precio del boleto, y una vez que estuvieron en el poder, hicieron rebajas de porcentajes mínimos en varios tipos de boletos, los cuales "juntos" sumaban "50%" (su primerísima mentira piadosa) y aún hoy día, a pesar de haberse llenado la boca contra la corrupción, ahora se comprueba que son iguales que sus antagonistas blancos y colorados? ¿Y se acuerdan de los blancos, con Lacalle al frente, cuyos tejes y manejes hicieron que el Banco Comercial pasara a manos de los Rohm (delincuentes que efectuaron estafas en varios países durante décadas) y le vendieron también el Banco Pan de Azucar a Stephan Benhamou (quien se exilió al saberse implicado en la obvia estafa del vaciado de dicho banco y murió en el exterior, a salvo de la justicia), ganándose él y su secretario (luego procesado por haber coimeado ineptamente) varios millones de dólares en la transacción?). Votar otra vez a estos (o a otros) políticos para darles otra oportunidad es ilógico. Continuar dándoles soporte es insensato cuando menos.

Mi propuesta: Anular el voto y preparanos para hacer lo mismo que se hizo en Islandia. ¿No saben qué pasó en Islandia? Bueno, averígüenlo y después me vienen a comentar.

Ah, y no me digan que hace falta una crisis económica para hacer lo que se hizo en Islandia... porque esa crisis ya está afectando a todo el planeta actualmente, y no deberíamos esperar a empeorar visíblemente como en el 2002 para poder hacer las cosas bien.

Podemos empezar hoy. ¿O nadie se dió cuenta de que por más que te quieran convencer de lo contrario, los precios SIEMPRE suben y NUNCA bajan y los sueldos NECESARIAMENTE tienen que subir para compensar la diferencia? ¿Nadie se dió cuenta de que es antinatural e innecesario este proceso, ya que los recursos con los que cuenta el país son practicamente los mismos y que la cantidad de gente que vive en él no ha aumentado, sino todo lo contrario? ¿No entienden que los recursos monetarios son irreales y que va a llegar el momento en el que el dinero solo será lo que realmente es, solo papel, ya que hace años que no existe la cantidad necesaria de oro que se supone que debería respaldar a la moneda? ¿Cabe alguna duda de que el sistema bancario de reserva fraccionaria y el neoliberalismo están dejando al mundo al borde del colapso y arrastra a nuestro país hacia el mismo destino, y que la institución que debería velar por la establidad, el Banco Central, ha sido manejado históricamente por gente corrupta que ha permitido a delincuentes como la familia Peirano y los Rohm abrir bancos una y otra vez, aún después de haber defraudado repetidamente a ahorristas y accionistas?

Discúlpenme si me río, pero a la vista están las pruebas... Todos sabemos de los manejes oscuros de los políticos, así que ¿porqué se los sigue votando? Hay que despertar y entender que los políticos y el bienestar de la gente gobernada por ellos son incompatibles entre sí. Son capaces de todo tipo de mentiras y arreglos sucios destinados a ponerse a ellos mismos en el poder, sin otro propósito, sin objetivos globales fuera de esos. Quien hoy día crea que votar tiene algún otro propósito que no sea engordar el bolsillo de algún político, está franca y defiitivamente equivocado. ¿Por qué se creen que aún hoy es obligatorio ir a votar? Porque si no lo fuera, la "lucha" se reduciría a los militantes, los fanáticos (esos que votan "con el corazón", como si se tratara de un partido de futbol), los que tienen intereses y apuestas fuertes dependientes de decisiones tomadas por gobernantes corruptos, y los políticos mismos. El resto se quedaría en casa disfrutando de un domingo en familia, algo que tiene mucho más valor que la política y el "manejo" del país.

¿Qué importa quien gane, si el dinero es el que gobierna realmente?

Como decía Edward R. Murrow, "Good night, and good luck"

jueves, 1 de marzo de 2012

El caso Miami-Box

Hace tres años que soy cliente de esta empresa, Miami-Box. Su servicio consiste en ofrecer direcciones físicas en Miami a residentes de Uruguay, de forma tal que cuando uno compra artículos en USA, (u otros lugares del mundo), estos se envíen a dicha dirección, desde la cual ellos se encargan de hacer el flete hacia Uruguay. Simple y conciso.

Traigo un promedio de dos o tres paquetes por mes, mayormente repuestos, artículos que no se consiguen acá, CDs o DVDs, libros, etc. Todo funcionó bien, hasta que en Febrero de 2012, la empresa cambió la forma en que factura a sus clientes. A partir de Febrero, todo paquete que llegue a través de su servicio y que no sea despachado por ellos mismos, deberá pagar un extra de U$S 15 por concepto de "Validación de Guía". ¿De qué se trata este concepto? Bueno, supuestamente consiste en la "validación" de la documentación necesaria para hacer el despacho del paquete... o sea, le dieron un nombre y un costo a un simple movimiento de papeles que no le cambia absolutamente nada al usuario, y que de hecho no existe como trámite en el mundo de las importaciones, por lo menos del lado del "fletero".

Básicamente, a partir del 1 de Febrero de 2012, Miami-Box le agregó un "peaje" a los paquetes despachados directamente por sus clientes, seguramente como forma de controlar la creciente demanda de servicios y la explosión de trabajo que los está desbordando (como ejemplo, tengo un paquete que fué entregado el 31 de Enero en las oficinas de Miami-Box, según el tracking del flete local, y todavía no llegó a la Aduana de Uruguay).

Más allá de que Miami-Box está en todo su derecho al cambiar su política de precios, el problema reside en que no le avisaron previamente a sus clientes habituales de este cambio, con lo cual, estos se han encontrado con la sorpresa de tener que desembolsar U$S 15 adicionales al costo que ya tenían calculado pagar.

Cualquier empresa seria habría avisado con suficiente anticipación (digamos, un mes) que iban a cambiar su política de precios, de manera de que los usuarios pudieran decidir si les valía la pena traer ciertos artículos de bajo costo y que muchas veces no ameritan un desembolso extra de más de un 100% del costo, en un trámite administrativo inexistente. Pues en Miami-Box decidieron que no era necesario tomarse la molestia de poner sobre aviso a sus clientes, sino que silenciosamente empezaron a cobrar este adicional en las facturas, y las quejas que se les hacen son respondidas de forma despectiva, o ignoradas cuando mucho. Y talvéz las empleadas fueron instruídas para desestimar quejas mandando a los usuarios a leer el sitio web, donde oportunamente publicaron el cambio en la facturación en un párrafo perdido en una página , como "al pasar", sin ningún tipo de énfasis que ayude a aclarar fácil y rápidamente la duda.

La "calculadora de costos" (un programa que publican para que la gente pueda hacer el cálculo de cuanto cuesta traer algo usando sus servicios) no tiene la capacidad de permitir el cálculo más aproximado posible, sino que omite claramente el costo de los "honorarios" de Miami-Box por el despacho (información que figura en otra página y que no queda claro porqué no está incluído en el calculador), y directamente carece de una opción para quienes desean hacer los despachos por sí mismos. Veamos un ejemplo, con datos ingresados y calculados usando el software que tienen disponible para dicho menester:


Costo en Miami (en U$S): 99.99
Der. de Internación U$S: 73.18
D.U.A U$S: 0.00
T.C.U U$S: 15.00
Despachante de aduana U$S: 15.00
Flete Internacional U$S: 12.60
Flete Nacional U$S: 0.00
Manejo U$S: 5.00
Total de Gastos U$S: 120.78


Acá faltan los "honorarios" de Miami-Box (U$S 10, indicados en otra página) y si uno hace el despacho uno mismo, debería reemplazar el concepto "Despachante de aduana" por el de "Validación de guía", ya que cuestan lo mismo. Esta gente se escuda poniendo un mensaje que indica que los "valores podrían sufrir pequeñas variaciones de costo", aunque en un paquete que vale U$S 10, esa variación ahora es del 150%, así que lo de "pequeña" le queda "corto"...

Paquetes comprados en Enero, cuando este costo no existía, fueron facturados en Febrero con el sobrecargo de la "validación de guía", con el agravante de que dichos paquetes fueron recibidos en Febrero porque "se atrasaron los vuelos", o sea que además de tener que esperar tres o cuatro semanas por algo que debería tardar solo una, tenemos que pagarles extra por un trámite que básicamente no existe, lo que es claramente un agravio a quienes somos clientes habituales.

En definitiva, Miami-Box está tratando a sus clientes de forma totalmente irrespetuosa. Se podría decir que una vez fueron pioneros en un servicio que hacía falta, pero ahora, con este cambio en la política, totalmente furtivo y sin notificación previa a los clientes, se han hecho acreedores de un grado inmenso de desconfianza y de mi más acérrimo repudio. A mi me perdieron como cliente, y estoy seguro de que a muchos otros también, por exactamente el mismo asunto. Ahora voy a ir a una empresa competidora y de mucho mayor renombre a nivel internacional, quienes seguramente me va a cobrar más caro, pero por lo menos no me van a "sorprender" con costos extra que aparecen de la nada y sin avisar. Prefiero pagar más por un servicio serio, que pagarle a alguien deshonesto y que cambia sus precios sin avisarme siquiera.

Ya está hecha la denuncia en Defensa del Consumidor, así que espero que les haya hecho provecho.

 
Gustavo Castro

Crea tu insignia