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 |
| 221 | rsync -aHvn --delete /mnt/sda2/ /opt/opengnsy/images/mount/$IMGNAME > /tmp/ogimg.lista |
| 222 | }}} |
| 223 | |
| 224 | 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 |
| 225 | {{{ |
| 226 | # Eliminamos comentarios de rsync y el directorio raíz. |
| 227 | sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g /tmp/ogimg.lista |
| 228 | sed -i '/^\.\//d' $IMGINFO |
| 229 | |
| 230 | grep -e '\->' -e '\=>' lista_img > /tmp/ogimg.ln |
| 231 | grep -e ^deleting lista_img | sed s/^deleting\ //g > /tmp/ogimg.rm |
| 232 | grep -v -e '\->' -e '\=>' -e ^deleting -e ^created lista_img > /tmp/ogimg.info |
| 233 | }}} |
| 234 | |
| 235 | En 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 | |
| 237 | Creamos la lista de acl completa: |
| 238 | {{{ |
| 239 | # Desmontamos la particion |
| 240 | ogUnmount 1 X |
| 241 | # Guardamos las ACL: |
| 242 | ntfs-3g.secaudit -b /dev/sdaX / > /tmp/ogimg.acl |
| 243 | }}} |
| 244 | |
| 245 | Filtramos 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. |
| 248 | sed -e s/"^#.*$"//g /tmp/ogimg.info > $FILES |
| 249 | sed -i '/^$/d' $FILES |
| 250 | |
| 251 | touch $ACLTMP |
| 252 | |
| 253 | # Recorremos el listado y extraemos la acl correspondiente al fichero o directorio. |
| 254 | while 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 |
| 259 | done < $FILES |
| 260 | |
| 261 | cp $ACLTMP /tmp/ogimg.acl |
| 262 | }}} |
| 263 | |
| 264 | |
| 265 | |
| 266 | Se crea el archivo de imagen diferencial vacío conteniendo un sistema de archivos (igual que en la completa) |
| 267 | {{{ |
| 268 | # Creamos archivo vacio. |
| 269 | dd 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. |
| 272 | KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}') |
| 273 | [ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS" |
| 274 | |
| 275 | # Creamos el sistema de ficheros: |
| 276 | LOOPDEVICE=$(losetup -f) |
| 277 | if [ $IMGFS == "EXT4" ]; then |
| 278 | losetup $LOOPDEVICE "$IMGNAME.img" |
| 279 | resize2fs -f $LOOPDEVICE &> $REPOLOG |
| 280 | else |
| 281 | mount -o compress=lzo "$IMGNAME.img" "$DIRMOUNT" |
| 282 | btrfs filesystem resize max "$DIRMOUNT" 2>&1 > $REPOLOG |
| 283 | fi |
| 284 | }}} |
| 285 | |
| 286 | Se 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. |
| 292 | rsync -aHq --files-from=/tmp/ogimg.info /mnt/sda2/ "$DIRMOUNT" |
| 293 | |
| 294 | # Se guardan los ficheros de información en la imagen. |
| 295 | rsync -aHAX$OPTRSYNC --inplace /tmp/ogimg.* "$DIRMOUNT" |
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 | | |
| 305 | mount $OGCAC$OGIM/$IMGNAME.img.diff "$DIRMOUNT" |
| 306 | }}} |
| 307 | |
| 308 | 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). |
| 309 | {{{ |
| 310 | # Copiamos los archivos de información a la partición destino: |
| 311 | rm /tmp/ogimg.* $DEST |
| 312 | cp $DIRMOUNT/ogimg.* $DEST |
| 313 | |
| 314 | rsync -aHq –files-from=$DEST/ogimg.info "$DIRMOUNT"/ /mnt/sdaX |
| 315 | }}} |
| 316 | |
| 317 | Borrará los archivos sobrantes, con la información de la lista para borrar: |
| 318 | {{{ |
| 319 | # "Diferencial: creando enlaces y borrando" |
| 320 | cd /mnt/sdaX |
| 321 | cat "$DIRMOUNT/ogimg.rm" 2>/dev/null | xargs rm -rf |
| 322 | }}} |
| 323 | |
| 324 | Creará 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 " |
| 329 | if [ $(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 | |
| 353 | fi |
| 354 | }}} |
| 355 | |
| 356 | En caso de windows restauramos las acl, exactamente igual que en la completa: |
| 357 | {{{ |
| 358 | # Copiamos las acl a /tmp |
| 359 | cp /mnt/sdaX/ogimg.acl /tmp |
| 360 | |
| 361 | # Desmontamos la partición: |
| 362 | ogUnmount 1 X |
| 363 | |
| 364 | # Restauramos las acl: |
| 365 | ntfs-3g.secaudit -se /dev/sdaX /tmp/ogimg.acl |
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] |
| 386 | Para la imagen sincronizable creamos el archivo de la imagen vacio y generamos dentro un sistema de ficheros: |
| 387 | {{{ |
| 388 | # Creamos archivo vacío. |
| 389 | dd 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. |
| 392 | KERNEL=$(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: |
| 396 | LOOPDEVICE=$(losetup -f) |
| 397 | if [ $IMGFS == "EXT4" ]; then |
| 398 | losetup $LOOPDEVICE "$IMGNAME.img" |
| 399 | resize2fs -f $LOOPDEVICE &> $REPOLOG |
| 400 | mount -o ro -t ext4 $IMGNAME.img "$DIRMOUNT" |
| 401 | else |
| 402 | mount -o compress=lzo "$IMGNAME.img" "$DIRMOUNT" |
| 403 | btrfs filesystem resize max "$DIRMOUNT" 2>&1 > $REPOLOG |
| 404 | fi |
| 405 | }}} |
| 406 | |
| 407 | Sincronizamos la imagen nueva desde la del partclone |
| 408 | {{{ |
| 409 | rsync -aHAX montar/ "$DIRMOUNT" |
| 410 | }}} |
| 411 | |
| 412 | |