Changes between Version 1 and Version 2 of SyncronizeBtrfs


Ignore:
Timestamp:
Jan 23, 2014, 11:28:16 AM (10 years ago)
Author:
irina
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SyncronizeBtrfs

    v1 v2  
    11[[TOC(heading=Índice)]]
    2 = Página en construcción: 13 enero 2013 =
    32= Sincronización de imágenes con Btrfs o ext4 =
    43== Introducción ==
    54Hasta 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.
    65
    7 
    86Con la sincronización de imágenes pretendemos:
    97 * comparar la imagen con el contenido de la partición y sólo copiar o borrar los archivos que difieran.
     
    2422Para windows restauraremos las ACL con ntfs-3g.secaudit
    2523
    26 En el servidor puedo montar la imagen y modificar, borra o añadir los archivos que queramos.
     24En el servidor puedo montar la imagen y modificar, borrar o añadir los archivos que queramos.
    2725
    2826
     
    3331Al 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.
    3432
    35 Al 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.
     33Al crear la imagen se hace una estimación del tamaño de los 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.
    3634
    3735La 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.
     
    5048
    5149
    52 Detectamos 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:
     50Detectamos cual es el kernel del cliente para elegir el sistema de ficheros a utilizar. Si es menor que 3.7 usamos ext4, si es mayor o igual btrfs:
    5351{{{
    5452KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}')
     
    7270
    7371
    74 === Sincronización imagen ===
     72Sincronización imagen:
    7573
    7674Montamos la imagen y la partición que queremos clonar y sincronizamos tomando como origen la partición.
     
    102100Sólo para windows: creamos la lista de acl:
    103101
    104 {{
     102{{{
    105103# Desmontamos la particion
    106104ogUnmount 1 X
     
    109107# Montamos la partición para seguir el proceso.
    110108ogMount 1 X
     109}}}
    111110
    112111# Sincronizamos la imagen desde la partición.
    113112
    114113{{{
    115 rsync -aHAX$OPTRSYNC --inplace --delete  /mnt/sdaX/ "opengnsys@$REPOIP::ogimages/mount/$IMGNAME"
     114rsync -aHAX$OPTRSYNC --inplace --delete  /mnt/sdaX/ "$DIRMOUNT"
    116115
    117116# Guardamos la lista del contenido y las acl si existen:
    118 rsync -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.
     117rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg.* "$DIRMOUNT"
     118}}}
     119
     120Es mejor utilizar el servicio de rsync en el servidor ya que cuando utilizamos rsync sobre samba va peor, la transferencia es más lenta. Este tema excede el objeto de está documentación.
    122121
    123122Desmontamos la imagen. En el servidor:
     
    127126
    128127
    129 == Restaurar - Sincronizar de la imagen tipo ext4 o btrfs ==
     128== Restaurar - Sincronizar una imagen tipo ext4 o btrfs ==
    130129
    131130La imagen puede estar en la cache o en repo.
     
    170169}}}
    171170
    172 
    173 == Nueva versión por aquí ==
    174 
    175171== Opciones rsync ==
    176172/ 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)
     
    180176-q –quiet: no muestra mensajes que no sean errores. Si no se pone a veces se cuelga el equipo.
    181177
    182 --delete  Borra los ficheros que no existían en el original
     178--delete  Borra los ficheros que no existían en el original. Si no lo ponemos actualizará los existentes en el origen y no tocará los nuevos.
    183179
    184180-A preserva ACLs
     
    190186-n realiza la prueba pero no hace cambios, nos sirve para crear el listado.
    191187
    192 
     188-z, --compress Comprime el fichero en la transferencia. Puede convenir o no dependiendo de dos factores: la capacidad de cálculo de ambos equipos para comprimir/descomprimir y el ancho de banda de la red (opcional).
    193189
    194190No utilizamos:
    195191
    196 -z, --compress Comprime el fichero en la transferencia → no: tanto en cache como repo va más lento
    197 
    198192-v, --verbose  : Muestra todos los archivos que se van copiando) → cuelga el equipo.
    199193
     
    214208
    215209'''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 
     210
     211Se 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
    222212{{{
    223213# Montamos imagen completa (con la que vamos a comparar)
    224 mount -t squashfs -o loop /opt/opengnsys/image/ImgCompleta $OGCAC$OGIMG/montar
     214if [ $IMGFS == "EXT4" ]; then
     215     mount -o ro -t ext4 $IMGNAME.img /opt/opengnsy/images/mount/$IMGNAME
     216else
     217     mount -o ro,compress=lzo  "$IMGNAME.img" "/opt/opengnsy/images/mount/$IMGNAME"
     218fi
     219
    225220# Creamos las diferencias
    226 rsync -aHvn --delete /mnt/sda2/ $OGCAC$OGIMG/montar > lista_img
    227 sed -i -e s/"^sent.*.bytes\/sec"//g  -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g lista_img
    228 
    229 # creasmo directorio temporarl
    230 mkdir $OGCAC$OGIMG/img.tmp
    231 grep -e '\->' -e  '\=>' lista_img > $OGCAC$OGIMG/img.tmp/list__ln
    232 grep -e  ^deleting  lista_img | sed s/^deleting\ //g > $OGCAC$OGIMG/img.tmp/list_rm
    233 grep -v -e '\->' -e  '\=>'  -e ^deleting  lista_img > $OGCAC$OGIMG/img.tmp/lista_rsync
    234 #
    235 echo "rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync /mnt/sda2/  $OGCAC$OGIMG/img.tmp" | tee -a $FILELOG
    236 rsync -aHq --files-from=$OGCAC$OGIMG/img.tmp/list_rsync  /mnt/sda2/  $OGCAC$OGIMG/img.tmp  >> $FILELOG 2>&1
    237 
    238 echo "mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff" | tee -a $FILELOG
    239 mksquashfs $OGCAC$OGIMG/img.tmp ubuntu11DesdePArticionSqfs.diff | tee -a $FILELOG
     221rsync -aHvn --delete /mnt/sda2/ /opt/opengnsy/images/mount/$IMGNAME > /tmp/ogimg.lista
     222}}}
     223
     224Se 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
     225{{{
     226# Eliminamos comentarios de rsync y el directorio raíz.
     227sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g /tmp/ogimg.lista
     228sed -i  '/^\.\//d' $IMGINFO
     229
     230grep -e '\->' -e  '\=>' lista_img > /tmp/ogimg.ln
     231grep -e  ^deleting  lista_img | sed s/^deleting\ //g > /tmp/ogimg.rm
     232grep -v -e '\->' -e  '\=>'  -e ^deleting -e ^created lista_img > /tmp/ogimg.info
     233}}}
     234
     235En caso de windows se genera el fichero de acl de la partición y se extraen las que corresponden a los ficheros que contiene la diferencial. Es un proceso que tarda mucho pero que nos ahorra tiempo cuando restauramos.
     236
     237Creamos la lista de acl completa:
     238{{{
     239# Desmontamos la particion
     240ogUnmount 1 X
     241# Guardamos las ACL:
     242ntfs-3g.secaudit -b /dev/sdaX / > /tmp/ogimg.acl
     243}}}
     244
     245Filtramos la lista de acl, extrayendo las de los ficheros que contiene la diferencial:
     246{{{
     247# Al fichero le quitamos las líneas sobrantes: comentarios y lineas vacías.
     248sed -e s/"^#.*$"//g /tmp/ogimg.info > $FILES
     249sed -i '/^$/d'  $FILES
     250
     251touch $ACLTMP
     252
     253# Recorremos el listado y extraemos la acl correspondiente al fichero o directorio.
     254while read LINE; do
     255    read END INI <<< "$(grep -n  -e "File" -e "Directory" $IMGACL| grep -A 1 "$LINE"| awk -F :  '!(NR%2){print $1" "p}{p=$1}' )"
     256    let NUM=$END-$INI-1
     257    # Si algún archivo no se encuentra, el error lo mandamos a /dev/null
     258    sed -n -e $INI,+"$NUM"p  /tmp/ogimg.acl  2>/dev/null | tee -a $ACLTMP > $OGLOGCOMMAND
     259done < $FILES
     260
     261cp $ACLTMP /tmp/ogimg.acl
     262}}}
     263
     264
     265
     266Se crea el archivo de imagen diferencial vacío conteniendo un sistema de archivos (igual que en la completa)
     267{{{
     268# Creamos archivo vacio.
     269dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED
     270
     271#Detectamos cual es el kernel del cliente para elegir el sistema de ficheros a utilizar.
     272KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}')
     273[ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS"
     274
     275# Creamos el sistema de ficheros:
     276LOOPDEVICE=$(losetup -f)
     277if [ $IMGFS == "EXT4" ]; then
     278      losetup $LOOPDEVICE "$IMGNAME.img"
     279      resize2fs -f $LOOPDEVICE &> $REPOLOG
     280else
     281      mount -o compress=lzo  "$IMGNAME.img" "$DIRMOUNT"
     282      btrfs filesystem resize max "$DIRMOUNT"  2>&1 > $REPOLOG
     283fi
     284}}}
     285
     286Se sincroniza de la partición a la imagen diferencial pasando a rsync la lista de archivo que debe copiar.
     287{{{
     288# Se monta la imagen diferencial (si es btrfs ya está montada en el paso anterior.)
     289[ $IMGFS == "EXT4" ] && mount $OPTMOUNT -t ext4 "$IMGNAME.img.diff" "$DIRMOUNT"
     290
     291# Se sincroniza.
     292rsync -aHq --files-from=/tmp/ogimg.info  /mnt/sda2/ "$DIRMOUNT"
     293
     294# Se guardan los ficheros de información en la imagen.
     295rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg.* "$DIRMOUNT"
    240296}}}
    241297
     
    243299
    244300Tras 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 {{{
    253 echo "Restaurar diferencial"  | tee -a $FILELOG
     301
     302Montará la partición destino y la imagen diferencial
     303{{{
    254304ogMount 1 X
    255 mount $OGCAC$OGIM/imagen.diff $OGCAC$OGIMG/montar
    256 rsync -aHq –files-from=$OGCAC$OGIMG/montar/list_rsync  $OGCAC$OGIMG/montar/ /mnt/sdaX | tee -a $FILELOG
    257 echo "Diferencial: creando enlaces y borrando"  | tee -a $FILELOG
    258 cd $PART
    259 rm -rf $(cat $OGCAC$OGIMG/montar/list_rc)
    260 
    261 # nota: mal la comparación de ->  no distingue el => para los enlaces duros
    262 while read dest enlace orig
    263 do
    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 ""
    274 done < $OGCAC$OGIMG/montar/list_ln
    275 
     305mount $OGCAC$OGIM/$IMGNAME.img.diff "$DIRMOUNT"
     306}}}
     307
     308Con 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).
     309{{{
     310# Copiamos los archivos de información a la partición destino:
     311rm /tmp/ogimg.* $DEST
     312cp $DIRMOUNT/ogimg.* $DEST
     313
     314rsync -aHq –files-from=$DEST/ogimg.info  "$DIRMOUNT"/ /mnt/sdaX
     315}}}
     316
     317Borrará los archivos sobrantes, con la información de la lista para borrar:
     318{{{
     319# "Diferencial: creando enlaces y borrando"
     320cd /mnt/sdaX
     321cat "$DIRMOUNT/ogimg.rm" 2>/dev/null | xargs rm -rf
     322}}}
     323
     324Creará o modificamos los enlaces, con la información de  la lista de enlaces
     325{{{
     326# La imagen diferencial tiene ogimg.ln
     327# para la completa lo generamos con los enlaces que contengan  /mnt/
     328[ -r "$DEST/ogimg.ln" ] || grep -e "->" -e "=>" "$DEST/ogimg.info"|grep "/mnt/" > "$DEST/ogimg.ln "
     329if [ $(wc -l "$DEST/ogimg.ln"|cut -f1 -d" ") -ne 0 ]; then
     330   while read LINEA
     331   do
     332        ORIGLN="${LINEA#*> }"
     333        # Si origen hace referencia a la particion lo modificamos
     334        echo $ORIGLN|grep "/mnt/"> /dev/null && ORIGLN="$DEST/${ORIGLN#/mnt/*/}"
     335        # rsync marca - los enlaces simbolicos y = enlaces "duros"
     336        LINEA="${LINEA%>*}"
     337        TYPELN="${LINEA##* }"
     338        DESTLN="${LINEA% *}"
     339
     340        if [ "$TYPELN" == "-" ]
     341        then
     342           OPTLN='-s'
     343        else
     344           OPTLN=''
     345        fi
     346        cd "$DEST/$(dirname "$DESTLN")"
     347        rm "$(basename "$DESTLN")"
     348        ln $OPTLN "$ORIGLN" "$(basename "$DESTLN")"
     349        echo -n "."
     350   done < "$DEST/ogimg.ln"  2>/dev/null
     351   echo ""
     352
     353fi
     354}}}
     355
     356En caso de windows restauramos las acl, exactamente igual que en la completa:
     357{{{
     358# Copiamos las acl a /tmp
     359cp /mnt/sdaX/ogimg.acl /tmp
     360
     361# Desmontamos la partición:
     362ogUnmount 1 X
     363
     364# Restauramos las acl:
     365ntfs-3g.secaudit -se /dev/sdaX /tmp/ogimg.acl
    276366}}}
    277367
     
    287377}}}
    288378
    289 Montando la imagen
     379Montando la imagen del partclone:
    290380{{{
    291381mkdir montar
     
    294384}}}
    295385
    296 Comprimiendo la imagen en formato sqfsImage.sqfs.lib
    297 
    298 {{{
    299 cd /opt/opengnsys/images
    300 sudo mkdit montar
    301 sudo mount -o loop ubuntuMontar montar
    302 sudo mksquashfs montar ubuntuMontar.sqfs
    303 }}}
    304 
    305 Montando el fichero sqfs
    306 {{{
    307 mount -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]
     386Para la imagen sincronizable creamos el archivo de la imagen vacio y generamos dentro un sistema de ficheros:
     387{{{
     388# Creamos archivo vacío.
     389dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED
     390
     391#Detectamos cual es el kernel del cliente para elegir el sistema de ficheros a utilizar.
     392KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}')
     393[ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS"
     394
     395# Creamos el sistema de ficheros y lo montamos:
     396LOOPDEVICE=$(losetup -f)
     397if [ $IMGFS == "EXT4" ]; then
     398      losetup $LOOPDEVICE "$IMGNAME.img"
     399      resize2fs -f $LOOPDEVICE &> $REPOLOG
     400      mount -o ro -t ext4 $IMGNAME.img "$DIRMOUNT"
     401else
     402      mount -o compress=lzo  "$IMGNAME.img" "$DIRMOUNT"
     403      btrfs filesystem resize max "$DIRMOUNT"  2>&1 > $REPOLOG
     404fi
     405}}}
     406
     407Sincronizamos la imagen nueva desde la del partclone
     408{{{
     409rsync -aHAX   montar/ "$DIRMOUNT"
     410}}}
     411
     412