[CentOS-es] mover virtuales con Xen y optimizar espacio

Eduardo Grosclaude eduardo.grosclaude en gmail.com
Mar Dic 30 13:22:11 UTC 2008


On Tue, Dec 30, 2008 at 8:36 AM, Carlos Moreira
<carlos.moreira en imcanelones.gub.uy> wrote:
> Buenas gente, les comento que estoy moviendo maquinas virtuales con Xen,
> que tengo instaladas en diferentes particiones de discos. estoy pudiendo
> moverlas en frio de un servidor a otro sin inconvenientes. Para ello uso
> el comando dd, lo que me permite crear un archivo de imagen a partir de
> una particion, moverlo, y despues clonar ese archivo en otra particion y
> poder levantar la maquina virtual. El problema que tengo, que no le he
> podido encontrar la vuelta, es cuando la particion de destino es mas
> grande que el archivo, como puedo hacer para que ese espacio de sobra
> quede como espacio libre en la nueva maquina virtual.
> Osea, supongamos tengo una maquina virtual sobre una partición de 30
> Gigas, pero que dentro del equipo virtual tengo 10 ocupados, esta al
> generar la imagen con dd, me genera un archivo de 30 gigas, me gustaría
> que me genere un archivo de 10 gigas. y luego al copiarlo a otro
> servidor y con dd nuevamente clonar la imagen en una partición de 50
> gigas, me gustaría que la maquina virtual levantada quedara con sus 10
> gigas ocupados y 40 gigas libres.
> Se entiende lo que pretendo hacer?? no se si es posible, ya que no he
> encontrado mucha información, salu2 Carlitos

Con dd no resolverías el caso ya que éste te va a hacer una copia
bloque a bloque; no vas a evitar que te copie bloques no utilizados
por la MV (porque dd no sabe cuáles están usados y cuáles no) ni te va
a modificar el tamaño de llegada sin destruir el sistema de archivos.
Para poder hacer todas esas cosas que necesitas deberías trabajar a
nivel de filesystem.

Se me ocurren dos maneras: una, agrandando el filesystem destino una
vez que ha sido copiado (con resize2fs); la otra, copiando
directamente los archivos sobre un filesystem preparado de antemano, y
del tamaño deseado, que me parece más práctico.

Para esto último necesitarías primero hacer un filesystem en la
partición destino (que por defecto va a resultar del tamaño máximo que
quepa en la partición) y copiar los archivos de la MV sobre ese
filesystem.

Una sugerencia para esto es utilizar rsync, que con ventaja sobre dd,
va a copiar solamente los bloques del filesystem que estén utilizados.
Otra sugerencia es evitar copiar contenidos de directorios que se
generan solos, como /proc, /sys, /dev.

Con rsync no vas a poder copiar el espacio de swap (porque no es
direccionable como un filesystem), así que no sé si esta técnica es
compatible con el objetivo de migrar MVs "en caliente", es decir, sin
interrumpir la operación de la MV, pero para esto hay técnicas aparte.
Sí lo es si hablamos de migración "en frío" lo cual entiendo es tu
objetivo. El espacio de swap entonces debería ser preparado en la
máquina destino, y no haría falta copiarlo.

El procedimiento que te describo es para copiar directamente de
partición a partición, pero si deseas crear un archivo conteniendo la
imagen de la MV (para hacer backups, o porque te parece más seguro
manipularlo así) también se puede hacer: creo un archivo del tamaño
ocupado del filesystem de la MV, le hago filesystem, lo monto con la
opción loop y copio la MV con rsync sobre ese directorio, con la misma
idea que antes. Al desmontar, tengo un archivo con el filesystem
copiado. Luego invierto el procedimiento hacia la máquina física
destino. Esto tiene ventajas como poder hacer el backup sobre otro
equipo (posiblemente en otro lugar, para prevención de desastres),
elegir los archivos que se incluirán o no, etc.

Otra posibilidad, aún más económica en espacio, es simplemente crear
un archivo tar.gz del filesystem de la MV. Esto tiene que ser óptimo
porque solamente se copiarán los archivos, sin espacio extra. En
cambio, en la opción con rsync, va a quedar sobredimensionado el
archivo destino de la copia aunque sea por un poquito. La ventaja con
rsync es que si haces la copia más de una vez (para rescatar estados
diferentes de la MV) sobre el mismo archivo, rsync solamente copiará
los archivos que hayan cambiado, así optimizas el tiempo de creación
de esas imágenes.

Otra cosa a tener en cuenta es que el filesystem de la MV origen esté
en estado consistente al momento de hacer la copia; una manera es
haciendo la imagen mientras la MV está apagada; otra, es utilizar LVM
en lugar de particiones crudas, sacar un snapshot (mientras la MV está
funcionando, o no) y copiar el snapshot. LVM es tu amigo, en ciertos
casos te va a permitir modificar dinámicamente el tamaño de los discos
virtuales aun *sin apagar las MV*.

-- 
Eduardo Grosclaude
Universidad Nacional del Comahue
Neuquen, Argentina


Más información sobre la lista de distribución CentOS-es