Buenos días, hoy me he encontrado con dificultades de migrar el contenido de un servidor que hacia la labor de almacen de correo en linux, dicho contenido esta exportado por nfs a través de una cabina de almacenamiento y necesitaba migrarlo a una nueva. Debido a la estructura interna de directorios que tiene el contenido, al tratar de realizar un rsync para la migración el servidor se quedaba sin recursos y me quedaba sin poder acceder a él.
Cuando lanzamos un rsync lo primero que realiza es construir una base de datos de los ficheros que va a copiar, por lo que tiene que recorrer cada uno de los directorios del contenido.
Al comprobar que el directorio principal del contenido tenia 247 carpetas hijas, he decidio migrar una a una, automatizando el proceso con el siguiente script, os voy a explicar como lo he hecho.
Lo primero de todo que he realizado es sacar el listado de directorios y guardarlo en un fichero llamado listado.txt teniendo en cuenta de eliminar el caracte / .
ls -p /exports/BuzonCorreo/ | grep '/' | sed -e "s/\///g" > listado.txt
Y ahora por cada directorio en el fichero vamos a realizar lo siguiente:
- Crear la carpeta con el mismo nombre.
- Proporcionar los permisos de la carpeta
- Cambiar el grupo y propietario de la carpeta.
- Realizar la sincronización.
- Dejamos 5 segundos de pausa entre sincronizaciones.
#!/bin/bash
ORIGEN='/exports/BuzonCorreo/'
DESTINO='/NuevoContenido/BuzonCorreo/'
for p in $(xargs < listado.txt);
do
mkdir -p ${DESTINO}${p}
chmod 700 ${DESTINO}${p}
chown sistemas:dbigcloud ${DESTINO}${p}
rsync -av --exclude=lost+found --bwlimit=10000 ${ORIGEN}${p} ${DESTINO}${p} > ${DESTINO}'nohups/'${p}'_nohup.txt'
sleep 5
done
Como podeis observar en el rsync tenemos las opciones:
--exclude=lost+found Con la cual vamos a excluir carpetas en este caso la carpeta lost+found
--bwlimit=10000 Con esta opción voy a limitar el ancho de banda, es un servidor de producción y no puedo permitirme su saturación.
Además por cada rsync que voy a realizar voy a guardar su salida en un fichero para verificar que la migración se va realizando correctamente.
nohup time bash migra.sh > migracion.out &
De esta forma he podido realizar la migración sin complicaciones. Como siempre digo los scripts son mejorables y se pueden realizar de muchas formas.