[[TOC(heading=Índice)]] = Sincronización de imágenes con SquashFS = == Introducción == Hasta ahora Opengnsys permite crear un archivo imagen de una partición completa que luego puede clonarse en otra. Estas imágenes hay que tratarlas como un todo y no permiten ver su contenido. Con la sincronización de imágenes pretendemos: * comparar la imagen con el contenido de la partición y sólo copiar o borrar los archivos que difieran. * comparar la imagen con el contenido de la partición y crear una imagen diferencial con los archivos que difieran y la información de los archivos que sobran, de forma que al restaurar primero la imagen completa y luego la diferencial la partición destino quede como la del equipo modelo. '''Procedimiento''' Creamos imágenes con mksquashfs Para restaurar montaremos la imagen (en cache o repo) y utilizaremos rsync para sincronizar la partición. El procedimiento funciona bien para la partición completa o para una partición donde se ha restaurado la imagen y luego se han realizado cambios. Para windows restauraremos las ACL con ntfs-3g.secaudit Nota: supongo que después de creada la imagen permitiría añadir nuevos ficheros (igual que ogclient), aunque quizás es demasido complejo para que sea práctico '''Problemas''' La transferencia de la imagen con formato sqfs a través de la red sólo ha ido bien con rsync. Cuando se ha intentado mandar por multicast o unicast ha fallado. Al restaurar la cache no se pueden mostrar log, si ponemos esta opción a rsync se cuelga el equipo. Se podría lanzar algún comando en paralelo que muestre lo que va aumentando la partición. == Crear una imagen tipo sqfs == La imagen será un archivo con formato squashfs del sistema de fichero de la partición. Para guardar la información de la imagen (como tenemos en partclone: tipo de sistema operativo, tamaño, archivos de que contiene, ...) necesitaremos incluir uno o varios archivos en el sistema de fichero original antes de realizar la creación. === Creación imagen Linux === Montamos la partición que queremos clonar y realizamos: {{{ # Creamos la lista del contenido y lo situamos en la particion a copiar.. rsync -aHvn --delete /mnt/sdaX/ montar > /tmp/oglista mv /tmp/oglista /mnt/sdaX # Nos situamos en la cache (o en repo) y creamos la imagen. cd $OGCAC$OGIMG mksquashfs /mnt/sdaX NombreIMG.sqfs }}} === Creación imagen window7 === La única diferencia es que guardamos las acl. Montamos la partición que queremos clonar y realizamos: {{{ # Creamos la lista del contenido y lo situamos en la particion a copiar. rsync -aHvn --delete /mnt/sda1/ montar > /tmp/oglista mv /tmp/oglista /mnt/sda1 # Guardamos el contenido de las acl ogUnmount 1 X | tee -a $FILELOG ntfs-3g.secaudit -b /dev/sdaX / > ogimage.acl ogMount 1 X cp /tmp/ogimage.acl /mnt/sdaX mksquashfs /mnt/sdaX nombreIMG.sqfs }}} == Restaurar - Sincronizar de la imagen tipo sqfs == La imagen puede estar en la cache o en repo. === Restauración imagen Linux === Para restaurar montaremos la imagen y la partición y copiaremos con rsync {{{ ogMount 1 2 mount -t squashfs -o loop /opt/opengnsys/image/ubuntuMontar.sqfs $OGCAC$OGIMG/montar rsync -a –delete –quiet /opt/opengnsys/cache/opt/opengnsys/images/montar/ /mnt/sda2 }}} === Restaurando imagen Imagen de windows === {{{ ogMount 1 1 mount -t squashfs -o loop /opt/opengnsys/image/Windows.sqfs /opt/opengnsys/cache/opt/opengnsys/images/montar rsync -aq -XH --delete $OGCAC$OGIMG/montar/ $PART 2>&1 | tee -a $FILELOG # Restableciendo acl cp $PART/ogimage.acl /tmp ogUnmount 1 1 ntfs-3g.secaudit -se /dev/sda1 /tmp/ogimage.acl }}} == Opciones rsync == / la barra en el directorio de origen hace que transfiera el contenido del directorio al directorio destino (si no la ponemos copia también el directorio) -a, --archive modo archivo: igual que -rlptgoD (no -H,-A,-X) conserva los enlaces simbólicos, dispositivos, permisos y propietario. -q –quiet: no muestra mensajes que no sean errores. Si no se pone a veces se cuelga el equipo. --delete Borra los ficheros que no existían en el original -A preserva ACLs -X preserva atributos extendidos (como los de Selinux) -H preserva enlaces “duros” -n realiza la prueba pero no hace cambios, nos sirve para crear el listado. No utilizamos: -z, --compress Comprime el fichero en la transferencia → no: tanto en cache como repo va más lento -v, --verbose : Muestra todos los archivos que se van copiando) → cuelga el equipo. --progress: muestra los archivos y el progreso → cuelga el equipo. -g preserva grupo (incluido en a) -o preserva propietario (incluido en a) == Crear una imagen diferencial == '''Definición de imagen diferencial: ''' Supongamos que tenemos una imagen completa y la hemos restaurado en un equipo que hará de modelo. Instalamos una serie de programas. Llamaremos imagen diferencial de una completa a la que contengan los archivos nuevos y la información de los archivos que sobran, de forma que al restaurar primero la imagen completa y luego la diferencial la partición destino quede como la del equipo modelo. '''Procedimiento''' * Se monta la imagen completa y se compara el contenido de la partición con la imagen: Se crea la lista de las diferencias con rsync * Se trata la lista de diferencias: se separan los archivos a copiar, a borrar y los enlaces (simbólicos o no), ya que se tendrán que procesar de forma diferente al restaurar. * En un directorio temporal se copian los archivos que están en la partición y no en la imagen completa. * Se crea una imagen squash del directorio {{{ # Montamos imagen completa (con la que vamos a comparar) mount -t squashfs -o loop /opt/opengnsys/image/ImgCompleta $OGCAC$OGIMG/montar # Creamos las diferencias rsync -aHvn --delete /mnt/sda2/ $OGCAC$OGIMG/montar > lista_img sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g lista_img # creasmo directorio temporarl mkdir $OGCAC$OGIMG/img.tmp grep -e '\->' -e '\=>' lista_img > $OGCAC$OGIMG/img.tmp/list__ln grep -e ^deleting lista_img | sed s/^deleting\ //g > $OGCAC$OGIMG/img.tmp/list_rm grep -v -e '\->' -e '\=>' -e ^deleting lista_img > $OGCAC$OGIMG/img.tmp/lista_rsync # echo "rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync /mnt/sda2/ $OGCAC$OGIMG/img.tmp" | tee -a $FILELOG rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync /mnt/sda2/ $OGCAC$OGIMG/img.tmp >> $FILELOG 2>&1 echo "mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff" | tee -a $FILELOG mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff | tee -a $FILELOG }}} == Restaurar - Sincronizar una imagen diferencial == Tras restaurar la imagen completa, la restauración de la imagen diferencial hará lo siguiente: * Montará la partición destino y la imagen diferencial * Con rsync copiará los archivos incluidos en la lista de la diferencial (Es más rápido que si se le permite que compare el contenido de la imagen con la partición). * Borrara los archivos sobrantes, con la información de la lista para borrar * Creará los enlaces simbólicos, con la informacón de la lista de enlaces {{{ echo "Restaurar diferencial" | tee -a $FILELOG ogMount 1 X mount $OGCAC$OGIM/imagen.diff $OGCAC$OGIMG/montar rsync -aHq –files-from=$OGCAC$OGIMG/montar/list_rsync $OGCAC$OGIMG/montar/ /mnt/sdaX | tee -a $FILELOG echo "Diferencial: creando enlaces y borrando" | tee -a $FILELOG cd $PART rm -rf $(cat $OGCAC$OGIMG/montar/list_rc) # nota: mal la comparación de -> no distingue el => para los enlaces duros while read dest enlace orig do echo $dest ... $enlace ... $orig if [ "$enlace" == "->" ] then echo enlace: $enlace OPTLN='-s' fi echo "ln $OPTLN ${dest%\/*}/$orig $dest" #ln $OPTLN ${dest%\/*}/$orig $dest echo "" done < $OGCAC$OGIMG/montar/list_ln }}} == Transformando una imagen de partclone en sqfs == Partimos de una imagen de partclone comprimida, la transformamos en una que se pueda montar. Se restaura la imagen en un fichero (dos opciones según el compresor): {{{ cat Imagen.img.gz | gzip -d -c | partclone.restore -C -s - -O imgMontable.img lzop -dc Ubuntu11.img | partclone.restore -C -s - -O ubuntu11Montar.img }}} Montando la imagen {{{ mkdir montar mount -o loop ubuntuMontar.img montar/ mount.ntfs-3g -o loop w7BasicaMontar.img montar/ }}} Comprimiendo la imagen en formato sqfsImage.sqfs.lib {{{ cd /opt/opengnsys/images sudo mkdit montar sudo mount -o loop ubuntuMontar montar sudo mksquashfs montar ubuntuMontar.sqfs }}} Montando el fichero sqfs {{{ mount -t squashfs -o loop ubuntuMontar.sqfs montar }}} == Pruebas == [wiki:SyncronizeComparacion Comparación gestión de imágenes rsync/mksquash con partclone]