27 may 2013

Transferir archivos entre los equipos de una red local mediante UDPcast

Como ya comenté en un artículo anterior, UDPcast es una herramienta de transferencia de archivos que permite enviar datos desde un equipo a varios destinatarios a la vez en una red local de una forma bastante rápida, sobre todo si la transferencia la realizamos en modo multicast (opción por defecto).

Y, como ya dije también, podemos usar UDPcast para:
  • Transferir archivos o directorios.
  • Clonar particiones directamente.
En este artículo voy a contar cómo enviar y recibir archivos y carpetas, pero, en otro momento veremos cómo clonar directamente, usando el UDPcast que montamos en el disco duro.

Para poder transferir archivos mediante UDPcast entre mis máquinas, lo primero que tenemos que hacer es instalar el paquete udpcast. Yo lo he instalado mediante puppet en todos los clientes, pero si tuviérais que instalarlo a mano, no hay ningún problema, porque se encuentra en los repositorios:

# apt-get install udpcast

Una vez instalado, ya podemos enviar y recibir. Así que abrimos una consola en el equipo que va a realizar el envío y otra en cada uno de los equipos que lo van a recibir.

Enviar y recibir archivos
UDPcast está pensado para enviar archivos de forma individual. Así que, si comprimimos el archivo antes de enviarlo, la transferencia se realizará en menos tiempo.

En el equipo servidor ejecutaremos:

# udp-sender --file archivo

Y en los equipos receptores:

# udp-receiver --file archivo

En el servidor nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a enviar datos:

"Ready. Press any key to start sending data."

En los clientes nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a recibir datos:

"Press any key to start receiving data!"

Pulsamos una tecla en el servidor o los clientes y comenzará a realizarse la transferencia.

Enviar y recibir directorios
 Si queremos enviar y recibir directorios, mediante un pipe podemos hacer uso de un empaquetador como tar o gzip:

En el equipo servidor ejecutaremos:

# tar cf - directorio | udp-sender

Y en los equipos receptores:

# udp-receiver | tar xf -

Al igual que en el caso anterior, en el servidor nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a enviar datos:

"Ready. Press any key to start sending data."

Y en los clientes nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a recibir datos:

"Press any key to start receiving data!"

Pulsamos una tecla en el servidor o los clientes y comenzará a realizarse la transferencia.

Enviar y recibir particiones
Como las particiones se tratan como archivos, si queremos clonar una partición, tan sólo tenemos que especificar el nombre de esa partición. Por ejemplo, si queremos clonar directamente la partición sda1 de una máquina en un conjunto de máquinas remotas:

En el equipo servidor ejecutaremos:

# udp-sender --file /dev/sda1

Y en los equipos receptores:

# udp-receiver --file /dev/sda1

En el servidor nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a enviar datos:

"Ready. Press any key to start sending data."

En los clientes nos mostrará un mensaje que dice que pulsemos una tecla para comenzar a recibir datos:

"Press any key to start receiving data!"

Pulsamos una tecla en el servidor o los clientes y comenzará a realizarse la transferencia.

 Algunas opciones útiles
UDPcast tiene muchas opciones. Algunas de las que me parecen más interesantes son las siguientes:
  • --interface ethX: Útil, si el equipo tiene varias interfaces de red para que escuche en una determinada.
  • --nokbd: Sirve para que el comando no espere a que el usuario pulse una tecla.
  • --min-receivers n: Sirve para indicar el número mínimo de receptores.
  • --min-receivers n: Sirve para indicar el número máximo de receptores.
  • --min-wait t: Mínimo tiempo (en segundos) a esperar antes de comenzar la transferencia.
  • --max-wait t: Máximo tiempo (en segundos) a esperar antes de comenzar la transferencia.

Insertar una cadena al final justo antes de la última línea de un archivo mediante sed

En muchas ocasiones tenemos que insertar, mediante bash, una cadena de texto al final de un archivo, justo antes de la última línea, como por ejemplo, en el archivo /etc/rc.local o /etc/gdm3/PostSession/Default, donde hay que insertar los comandos antes de la línea que dice: "exit 0".

En linux tenemos muchas formas de hacerlo, pero para mí la más sencilla es ésta:

# sed -i '$ i\cadena' archivo

Vamos a verlo con un ejemplo:

Si quiero lanzar ocsinventory-agent en el inicio de una máquina, tengo que hacer una llamada a ocsinventory-agent en el archivo /etc/rc.local.

El archivo /etc/rc.local tiene por defecto el siguiente contenido:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

Como lo que necesito es insertar la cadena "ocsinventory-agent" justo antes de la línea que dice "exit 0", lo que tengo que hacer es ejecutar el siguiente comando:

# sed -i '$ i\ocsinventory-agent\n' /etc/rc.local

Como se puede ver, inserto in-line ( parámetro -i) la cadena ocsinventory-agent y un salto de línea en el archivo /etc/rc.local.

Después de ejecutar el comando, el archivo quedaría así:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

ocsinventory-agent

exit 0

Un detalle importante: Debemos tener cuidado si ejecutamos el comando más de una vez porque estaremos insertando varias veces la misma cadena. Si queremos ejecutar el comando dentro de un script, de tal manera que la cadena se inserte tan sólo una vez, deberíamos controlarlo de algún modo. Por ejemplo, así:

# grep -q ocsinventory-agent /etc/rc.local 2> /dev/null || sed -i '$ i\ocsinventory-agent\n' /etc/rc.local

De este modo, la inserción sólo se realizará cuando la cadena no estuviera ya insertada en el archivo.

Instalar UDPCast en una partición

En el siguiente artículo, mostré cómo podíamos añadir dos entradas de grub a nuestros portátiles: una para permitir autorestaurar el portátil y la otra para lanzar clonezilla de modo general:
http://enavas.blogspot.com.es/2013/05/en-el-articulo-httpenavas.html

Estas entradas van a ser muy útiles para nosotros porque nos van a permitir cosas como restaurar el portátil sin necesidad de tener red o crear una nueva imagen del sistema y almacenarla en el mismo portátil.

Bueno, pues además de clonezilla, hay otra herramienta muy interesante que merece la pena añadir a nuestros portátiles: UDPcast.

UDPcast es una herramienta de transferencia de archivos que permite enviar datos de forma simultánea desde un equipo a varios destinatarios en una red local. Imaginad lo útil que puede ser ésto:
  • Podremos copiar un archivo o conjunto de archivos de forma simultánea a todos los equipos a la vez.
  • O podremos copiar particiones de un equipo a una serie de máquinas a la vez.
En este artículo vamos a ver cómo montar UDPcast en la partición de arranque de nuestros portátiles.

Partimos de que el portátil tiene una partición /dev/sda1 donde se encuentra el /boot y queremos montar UDPcast en esa misma partición.

Iniciamos el equipo, y creamos un directorio para udpcast en el directorio /boot:
# mkdir /boot/udpcast

Nos situamos dentro del directorio:
# cd /boot/udpcast

Descargamos el kernel:
# wget http://udpcast.linux.lu/current/linux

Descargamos el initrd:
# wget http://udpcast.linux.lu/current/initrd

Editamos el archivo /etc/grub.d/40_custom y le añadimos la siguiente entrada de grub:
menuentry "Udpcast" {
   set root=(hd0,1)
   linux /udpcast/linux
   initrd /udpcast/initrd
}
Como ya teníamos montado antes clonezilla, nos quedaría más o menos así:

/etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "Clonar sistema (/dev/sda1, /dev/sda2) sin modificar home (/dev/sda6)" {
   set root=(hd0,3)
   linux /livehd/vmlinuz boot=live config noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-restore\" ocs_live_extra_param=\" -c -k -p poweroff restoreparts miniportatil sda1 sda2\" keyboard-layouts=\"NONE\" ocs_live_batch=\"yes\" locales=\"es_ES.UTF-8\" vga=788 ip=frommedia nosplash live-media-path=/livehd bootfrom=/dev/sda3
   initrd /livehd/initrd.img
}

menuentry "Clonezilla general" {
   set root=(hd0,3)
   linux /livehd/vmlinuz boot=live config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts=\"\" ocs_live_batch=\"no\" locales=\"\" vga=788 ip=frommedia nosplash live-media-path=/livehd bootfrom=/dev/sda3
   initrd /livehd/initrd.img
}

menuentry "Udpcast" {
   set root=(hd0,1)
   linux /udpcast/linux
   initrd /udpcast/initrd
}

Por último, hacemos un update-grub2 para regenerar el archivo /boot/grub/grub.cfg:
# update-grub2

Con ésto, ya tendríamos montado UDPcast en nuestro disco duro.

En otro artículo os mostraré cómo usar udpcast para transferir archivos y clonar particiones.