Changes between Initial Version and Version 1 of SyncronizeBtrfs


Ignore:
Timestamp:
Jan 13, 2014, 2:33:47 PM (10 years ago)
Author:
irina
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SyncronizeBtrfs

    v1 v1  
     1[[TOC(heading=Índice)]]
     2= Página en construcción: 13 enero 2013 =
     3= Sincronización de imágenes con Btrfs o ext4 =
     4== Introducción ==
     5Hasta 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.
     6
     7
     8Con la sincronización de imágenes pretendemos:
     9 * comparar la imagen con el contenido de la partición y sólo copiar o borrar los archivos que difieran.
     10 * 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.
     11
     12La sincronización de imágenes se introducirá en la versión 1.0.5 en modo de prueba. Tenemos dos aproximaciones diferentes que denominamos SYNC1 y SYNC2 la diferencia principal es que la versión 1 guarda los datos de las imágenes en un directorio del servidor y la versión 2 lo empaqueta en un archivo que contiene un sistema de ficheros, según el kernel del cliente de opengnsys será ext4 o btrfs.
     13
     14Estos sistemas de ficheros son de lectura y escritura, por lo que nos permite modificar la imagen una vez creada. Además el btrfs permite montarlo en modo comprimido, de forma que la compresión y descompresión se realiza de modo transparente para el usuario.
     15
     16En esta página vamos a documentar los procedimientos que se utilizan en la versión sync2, aunque si se van a hacer pruebas es mejor instalar la versión 1.0.5 o utilizar los script bajados del proyecto.
     17
     18'''Procedimiento'''
     19
     20Creamos imágenes (en cache o repo). Creamos un archivo vacío, lo montamos en modo loop y creamos dentro de él un sistema de ficheros. Montamos el sistema de fichero y clonamos dentro con los datos de la partición sincronizandolos con rsync.
     21
     22Para restaurar montaremos la imagen (en cache o repo) y utilizaremos rsync para sincronizar la partición. La partición puede estar vacía o haber sido restaurada y luego modificada por el uso.
     23
     24Para windows restauraremos las ACL con ntfs-3g.secaudit
     25
     26En el servidor puedo montar la imagen y modificar, borra o añadir los archivos que queramos.
     27
     28
     29'''Problemas conocidos.'''
     30
     31Al crear la imagen en el servidor hay veces que no se monta bien, la sincronización se realiza sobre el directorio de montaje y la imagen queda vacía. Al restaurar se monta la imagen sobre el directorio y no tiene datos. Es muy importante comprobar el contenido de la imagen.
     32
     33Al restaurar la cache no se pueden mostrar log, si ponemos esta opción a rsync se cuelga el equipo. Esto pasaba con las imágenes en squash, no se ha vuelto a probar con las que son en ext4 o btrfs.
     34
     35Al crear la imagen se hace una estimación del tamaño delos datos para crear el archivo vacío inicial, al terminar se reduce hasta el tamaño real que ocupan los datos. Esto funciona bien en ext4, pero en btrfs no se puede hacer porque el comando que trae la distribución da error muy a menudo.
     36
     37La transferencia de la imagen con formato ext4 y btrfs a través de la red ha ido bien con multicast, unicast y rsync. No se ha probado con torrent.
     38
     39== Crear una imagen tipo ext4 o btrfs ==
     40La imagen será un archivo con un sistema de fichero que contenga los datos de la partición.
     41
     42Creamos el archivo vacío:
     43{{{
     44dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED
     45}}}
     46
     47IMGFILE: nombre archivo imagen.\\
     48SIZEREQUIRED: tamaño de la imagen en kilobytes.
     49
     50
     51
     52Detectamos cual es el kernel para elegir el sistema de ficheros a utilizar. Si es menor que 3.7 usamos ext4, si es mayor o igual btrfs:
     53{{{
     54KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}')
     55[ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS"
     56}}}
     57
     58
     59Creamos el sistema de ficheros:
     60{{{
     61LOOPDEVICE=$(losetup -f)
     62if [ $IMGFS == "EXT4" ]; then
     63      losetup $LOOPDEVICE "$IMGNAME.img"
     64      resize2fs -f $LOOPDEVICE &> $REPOLOG
     65else
     66      mount -o compress=lzo  "$IMGNAME.img" "$DIRMOUNT"
     67      btrfs filesystem resize max "$DIRMOUNT"  2>&1 > $REPOLOG
     68fi
     69}}}
     70
     71Para 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.
     72
     73
     74=== Sincronización imagen ===
     75
     76Montamos la imagen y la partición que queremos clonar y sincronizamos tomando como origen la partición.
     77
     78Montamos la imagen. En el servidor:
     79{{{
     80if [ $IMGFS == "EXT4" ]; then
     81     mount $OPTMOUNT -t ext4 $1 $2
     82else
     83     mount $OPTMOUNT -o compress=lzo  "$1" "$2"
     84fi
     85}}}
     86
     87OPTMOUNT: ro cuando restauramos, vacío al crearla, ya que por defecto es de lectura y escritura.
     88
     89Montamos la partición, en el cliente:
     90{{{
     91ogMount 1 X
     92}}}
     93
     94# Creamos la lista del contenido.
     95
     96{{{
     97mkdir /tmp/vacio
     98# Creamos la lista del contenido y lo situamos en la particion a copiar.
     99rsync -aHvn --delete /mnt/sdaX/ /tmp/vacio > /tmp/ogimg.lista
     100}}}
     101
     102Sólo para windows: creamos la lista de acl:
     103
     104{{
     105# Desmontamos la particion
     106ogUnmount 1 X
     107# Guardamos las ACL:
     108ntfs-3g.secaudit -b /dev/sdaX / > /tmp/ogimg.acl
     109# Montamos la partición para seguir el proceso.
     110ogMount 1 X
     111
     112# Sincronizamos la imagen desde la partición.
     113
     114{{{
     115rsync -aHAX$OPTRSYNC --inplace --delete  /mnt/sdaX/ "opengnsys@$REPOIP::ogimages/mount/$IMGNAME"
     116
     117# Guardamos la lista del contenido y las acl si existen:
     118rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg.* opengnsys@$REPOIP::ogimages/mount/$IMGNAME *
     119}}}
     120
     121* Utilizamos el servicio de rsync en el servidor, ya que cuando utilizamos rsync sobre samba va peor. La configuración se explica abajo.
     122
     123Desmontamos la imagen. En el servidor:
     124{{{
     125umount /opt/opengnsys/images/mount/$IMGNAME
     126}}}
     127
     128
     129== Restaurar - Sincronizar de la imagen tipo ext4 o btrfs ==
     130
     131La imagen puede estar en la cache o en repo.
     132
     133Montamos la imagen:
     134Montamos la imagen. En el servidor:
     135
     136{{{
     137# Creamos el punto de montaje:
     138mkdir /opt/opengnsy/images/mount/$IMGNAME
     139
     140# Montamos la imagen:
     141if [ $IMGFS == "EXT4" ]; then
     142     mount -o ro -t ext4 $IMGNAME.img /opt/opengnsy/images/mount/$IMGNAME
     143else
     144     mount -o ro,compress=lzo  "$IMGNAME.img" "/opt/opengnsy/images/mount/$IMGNAME"
     145fi
     146}}}
     147
     148Montamos la partición, en el cliente:
     149{{{
     150ogMount 1 X
     151}}}
     152
     153Sincronizamos la partición tomando como origen la imagen. La partición puede estar vacía o haber sido restaurada con anterioridad y sólo hay que restaurar las modificaciones que haya hecho por el uso.
     154
     155{{{
     156rsync -aHAXq$OPTRSYNC --password-file=/passrsync  opengnsys@$REPOIP::ogimages/mount/$IMGNAME /mnt/sdaX
     157}}}
     158
     159Sólo para windows restauramos las ACL:
     160
     161{{{
     162# Copiamos las acl a /tmp
     163cp //mnt/sdaX/ogimg.acl /tmp
     164
     165# Desmontamos la partición:
     166ogUnmount 1 X
     167
     168# Restauramos las acl:
     169ntfs-3g.secaudit -se /dev/sdaX /tmp/ogimg.acl
     170}}}
     171
     172
     173== Nueva versión por aquí ==
     174
     175== Opciones rsync ==
     176/ 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)
     177
     178-a, --archive  modo archivo: igual que -rlptgoD (no -H,-A,-X) conserva los enlaces simbólicos, dispositivos, permisos  y propietario.             
     179
     180-q –quiet: no muestra mensajes que no sean errores. Si no se pone a veces se cuelga el equipo.
     181
     182--delete  Borra los ficheros que no existían en el original
     183
     184-A preserva ACLs
     185
     186-X preserva atributos extendidos (como los de Selinux)
     187
     188-H preserva enlaces “duros”
     189
     190-n realiza la prueba pero no hace cambios, nos sirve para crear el listado.
     191
     192
     193
     194No utilizamos:
     195
     196-z, --compress Comprime el fichero en la transferencia → no: tanto en cache como repo va más lento
     197
     198-v, --verbose  : Muestra todos los archivos que se van copiando) → cuelga el equipo.
     199
     200--progress: muestra los archivos y el progreso → cuelga el equipo.
     201
     202-g preserva grupo (incluido en a)
     203
     204-o preserva propietario (incluido en a)
     205
     206== Crear una imagen diferencial ==
     207
     208'''Definición de imagen diferencial: '''
     209
     210Supongamos que tenemos una imagen completa y la hemos restaurado en un equipo que hará de modelo. Instalamos una serie de programas.
     211
     212Llamaremos 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.
     213
     214
     215'''Procedimiento'''
     216 * 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
     217 * 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.
     218 * En un directorio temporal se copian los archivos que están en la partición y no en la imagen completa.
     219 * Se crea una imagen squash del directorio
     220
     221
     222{{{
     223# Montamos imagen completa (con la que vamos a comparar)
     224mount -t squashfs -o loop /opt/opengnsys/image/ImgCompleta $OGCAC$OGIMG/montar
     225# Creamos las diferencias
     226rsync -aHvn --delete /mnt/sda2/ $OGCAC$OGIMG/montar > lista_img
     227sed -i -e s/"^sent.*.bytes\/sec"//g  -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g lista_img
     228
     229# creasmo directorio temporarl
     230mkdir $OGCAC$OGIMG/img.tmp
     231grep -e '\->' -e  '\=>' lista_img > $OGCAC$OGIMG/img.tmp/list__ln
     232grep -e  ^deleting  lista_img | sed s/^deleting\ //g > $OGCAC$OGIMG/img.tmp/list_rm
     233grep -v -e '\->' -e  '\=>'  -e ^deleting  lista_img > $OGCAC$OGIMG/img.tmp/lista_rsync
     234#
     235echo "rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync /mnt/sda2/  $OGCAC$OGIMG/img.tmp" | tee -a $FILELOG
     236rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync  /mnt/sda2/  $OGCAC$OGIMG/img.tmp  >> $FILELOG 2>&1
     237
     238echo "mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff" | tee -a $FILELOG
     239mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff | tee -a $FILELOG
     240}}}
     241
     242== Restaurar - Sincronizar una imagen diferencial ==
     243
     244Tras restaurar la imagen completa, la restauración de la imagen diferencial hará lo siguiente:
     245 * Montará la partición destino y la imagen diferencial
     246 * 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).
     247 * Borrara los archivos sobrantes, con la información de la lista para borrar
     248 * Creará los enlaces simbólicos, con la informacón de  la lista de enlaces
     249
     250
     251
     252{{{
     253echo "Restaurar diferencial"  | tee -a $FILELOG
     254ogMount 1 X
     255mount $OGCAC$OGIM/imagen.diff $OGCAC$OGIMG/montar
     256rsync -aHq –files-from=$OGCAC$OGIMG/montar/list_rsync  $OGCAC$OGIMG/montar/ /mnt/sdaX | tee -a $FILELOG
     257echo "Diferencial: creando enlaces y borrando"  | tee -a $FILELOG
     258cd $PART
     259rm -rf $(cat $OGCAC$OGIMG/montar/list_rc)
     260
     261# nota: mal la comparación de ->  no distingue el => para los enlaces duros
     262while read dest enlace orig
     263do
     264   echo $dest ... $enlace ... $orig
     265   if [ "$enlace" == "->" ]
     266   then
     267        echo enlace: $enlace
     268        OPTLN='-s'
     269   fi
     270
     271   echo "ln $OPTLN   ${dest%\/*}/$orig $dest"
     272   #ln $OPTLN   ${dest%\/*}/$orig $dest
     273   echo ""
     274done < $OGCAC$OGIMG/montar/list_ln
     275
     276}}}
     277
     278== Transformando una imagen de partclone en sqfs ==
     279
     280Partimos de una imagen de partclone comprimida, la transformamos en una que se pueda montar.
     281
     282Se restaura la imagen en un fichero (dos opciones según el compresor):
     283{{{
     284cat Imagen.img.gz | gzip -d -c | partclone.restore -C -s - -O imgMontable.img
     285
     286lzop -dc Ubuntu11.img | partclone.restore -C -s - -O ubuntu11Montar.img
     287}}}
     288
     289Montando la imagen
     290{{{
     291mkdir montar
     292mount -o loop ubuntuMontar.img montar/
     293mount.ntfs-3g -o loop w7BasicaMontar.img montar/
     294}}}
     295
     296Comprimiendo la imagen en formato sqfsImage.sqfs.lib
     297
     298{{{
     299cd /opt/opengnsys/images
     300sudo mkdit montar
     301sudo mount -o loop ubuntuMontar montar
     302sudo mksquashfs montar ubuntuMontar.sqfs
     303}}}
     304
     305Montando el fichero sqfs
     306{{{
     307mount -t squashfs -o loop ubuntuMontar.sqfs montar
     308}}}
     309
     310== Pruebas ==
     311[wiki:SyncronizeComparacion Comparación gestión de imágenes rsync/mksquash con partclone]