[GUIA] Arreglando problemas con los backups de Time Machine

Aunque lo he publicado primeramente en el portal de Ironcatan y posteriormente en todopocketpc, lo publico aqui también.

Últimamente he tenido ciertos problemas con las imágenes dinámicas (sparsebundle) que el time machine crea cuando hacemos copias de seguridad en red, bien sea en un time capsule,o en un NAS (como es mi caso). Voy a explicaros como intentar solucionar estos problemas si los llegarais a tener algún dia.

Un poco de Historia:

Desde la version 10.6.3, time machine realize una verificación de las imágenes para comprobar si puede seguir haciendo backup o no. En caso de error, arroja un mensaje similar a este: ”Time Machine ha finalizado la verificación de las copias de seguridad. Para mejorar la fiabilidad, Time Machine tiene que crear una nueva copia de seguridad para ti”. Aceptar esto implica que borramos todo nuestro historial de copias de seguridad, y empezamos de cero… Estupendo no? Como no la imagen no me gusta, pues te borro todo y volver a empezar… Casi que no, vamos a ver si la podemos arreglar.

Arreglando la imagen

Antes de empezar debo advertir que es un proceso totalmente en línea de comando (CLI) y que cuidadito con lo que se hace que nos podemos cargar el backup, no me hago responsable de las posibles "cagadas" XD ; dicho esto, vamos al lio!

Las imágenes que crea time machine (sparsebundle) al final no son más que “emulaciones” de discos duros, por así decirlo. Por lo tanto son susceptibles de que puedan ser reparadas con las utilidades propias que nos facilita el mac os para reparación de discos físicos.
Primeramente debemos eliminar los flags que coloca time machine a las copias de seguridad. Para ello, abrimos un terminal, nos hacemos root y ponemos lo siguiente:

linn:~ i5Js$ sudo su -
Password:
linn:~ root#
linn:Volumes root# chflags -R nouchg /Volumes/Backup/Linn.sparsebundle


/Volumes/Backup/Linn.sparsebundle es la ruta de mi imagen de backup, aqui debeis susituirla por la que corresponda en vuestro caso.
Este comando tardará un poco, en función de si la imagen es muy grande o muy pequeña.

Antes del siguiente paso, abrir otro terminal y ejecutar lo siguiente, no es necesario hacerlo como root

linn:~ i5Js$ tail -f /var/log/fsck_hfs.log


Este comando nos saca el log del comando fsck que se ejecutará posteriormente, nos vendrá bien para saber en que paso está y que está haciendo.

Una vez que ha terminado el comando chflags viene le truco que puede salvar nuestros backups. En sistemas unix/linux, podemos conectar un disco usb/firewire etc pero no llegar a montarlo, es decir, el sistema operativo reconoce que tiene algo conectado, pero no lo monta para usarlo. Por lo tanto, con las imagenes pasa lo mismo, asi que tanto si nuestro error es de verificación como de montaje, ejecutamos lo siguiente:

linn:~ root# hdiutil attach -nomount -noverify -noautofsck /Volumes/Backup/Linn.sparsebundle


Debería apareceros algo similar a esto: (el número de disco disk1, puede variar en función del numero de discos duros que tengáis.)

/dev/disk1             Apple_partition_scheme
/dev/disk1s1           Apple_partition_map
/dev/disk1s2           Apple_HFSX


Anotaros bien el disco que corresponde a la etiqueta Apple_HFSX pues es el que vamos a utilizar.

Como se puede apreciar, la clave está en el flag -nomount del comando. Vuelvo a insistir, que /Volumes/Backup/Linn.sparsebundle es mi imagen, cambiarlo por la vuestra.

Ahora pueden ocurrir dos cosas: la primera es que automáticamente se ejecute el comando fsck, y por lo tanto no tenemos que hacer nada. Lo podemos comprobar en la otra ventana del terminal con el log del fsck, deberíamos encontrar algo similar a esto:

dev/rdisk1s2: fsck_hfs run at Mon Jul 25 11:47:47 2011
/dev/rdisk1s2: ** /dev/rdisk1s2 (NO WRITE)
/dev/rdisk1s2:    Executing fsck_hfs (version diskdev_cmds-540.1~34).
QUICKCHECK ONLY; FILESYSTEM DIRTY

/dev/rdisk1s2: fsck_hfs run at Mon Jul 25 11:47:47 2011
/dev/rdisk1s2: ** /dev/rdisk1s2
/dev/rdisk1s2:    Executing fsck_hfs (version diskdev_cmds-540.1~34).
** Detected a case-sensitive volume.
   The volume name is Backup of Linn
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
.
.
.


Lo segundo que puede ocurrir, es que el comando fsck no se lance automáticamente y lo tengamos que hacer a mano. Para ello ponemos lo siguiente:

linn:~ root# fsck_hfs -drfy /dev/disk1s2


Con esto empezará el chequeo, apareciendo un log similar al anterior. Ahora es cuando os podeis ir a dar una vuelta, al cine, con la novia, a domir, ya que según el tamaño, puede llegar a tardar hasta 24h. Os adjunto mi log para que veais lo que puede salir:

QUICKCHECK ONLY; FILESYSTEM DIRTY

/dev/rdisk1s2: fsck_hfs run at Sun Jul 24 09:30:58 2011
/dev/rdisk1s2: ** /dev/rdisk1s2
/dev/rdisk1s2:    Executing fsck_hfs (version diskdev_cmds-540.1~34).
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Backup of Linn
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
   Incorrect number of file hard links
** Checking catalog hierarchy.
** Checking extended attributes file.
   Incorrect number of extended attributes
   (It should be 4155683 instead of 4155664)
** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
   Invalid volume file count
   (It should be 9116784 instead of 9075531)
   Invalid volume directory count
   (It should be 1009463 instead of 998811)
   Invalid volume free block count
   (It should be 366540978 instead of 368554972)
   Volume header needs minor repair
(2, 0)
/dev/rdisk1s2: ** Repairing volume.
   Indirect node 72958182 needs link count adjustment
   (It should be 26 instead of 27)
   Indirect node 73298165 needs link count adjustment
   (It should be 28 instead of 27)
   Indirect node 73298166 needs link count adjustment
   (It should be 28 instead of 27)
   Indirect node 73298167 needs link count adjustment
   (It should be 28 instead of 27)
   Indirect node 73298168 needs link count adjustment
   (It should be 28 instead of 27)
   Indirect node 73298169 needs link count adjustment
   (It should be 28 instead of 27)
   Indirect node 73298170 needs link count adjustment
   (It should be 27 instead of 26)
   Indirect node 73298171 needs link count adjustment
   (It should be 15 instead of 14)
   Indirect node 73298172 needs link count adjustment
   (It should be 27 instead of 26)
   Indirect node 73298174 needs link count adjustment
   (It should be 28 instead of 27)
** Rechecking volume.
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Backup of Linn
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
   Invalid map node
(8, 0)
/dev/rdisk1s2: ** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
** Repairing volume.
** Rechecking volume.
** Checking Journaled HFS Plus volume.
** Detected a case-sensitive volume.
   The volume name is Backup of Linn
** Checking extents overflow file.
** Checking catalog file.
** Checking multi-linked files.
** Checking catalog hierarchy.
** Checking extended attributes file.
** Checking multi-linked directories.
** Checking volume bitmap.
** Checking volume information.
** The volume Backup of Linn was repaired successfully.


Si hemos llegado hasta aquí, enhorabuena! tenemos casi lista nuestra imagen para vovler hacer backups. Pero antes de eso, debemos modificar un fichero. Se encuentra dentro de nuestra imagen .sparsebundle y se llama com.apple.TimeMachine.MachineID.plist

linn:~ root# cd /Volumes/Backup/Linn.sparsebundle/
linn:Linn.sparsebundle root# ls -la
total 32
-rwxrwxrwx      1 i5Js  staff      500 Jan 19  2008 Info.plist
drwxrwxrwx@ 59999 i5Js  staff  2039922 Jul 24 08:30 bands
-rwxrwxrwx      1 i5Js  staff      519 Jul 25 11:08 com.apple.TimeMachine.MachineID.plist
-r-xr-xr-x      1 i5Js  staff        0 Jan 19  2008 token

Lo editamos con el vi, obteniendo algo similar a esto:

?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
plist version="1.0">
dict>
   key>RecoveryBackupDeclinedDate</key>
   date>2011-07-25T09:08:00Z</date>
   key>VerificationDate</key>
   date>2011-07-25T09:07:37Z</date>
   key>VerificationExtendedSkip</key>
   false/>
   key>VerificationState</key>
   integer>2</integer>
   key>com.apple.backupd.HostUUID</key>
   string>00000000-0000-1000-8000-001B63B5665E</string>
/dict>
/plist>


La clave son las líneas RecoveryBackupDeclinedDate y VerificationState. En el caso de la primera, la eliminamos, asi como el campo date que esta a continuación; el campo VerificationState, lo cambiamos a 0. Denería quedaros algo similar a esto:

?xml version="1.0" encoding="UTF-8"?>
!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
plist version="1.0">
dict>
   key>VerificationExtendedSkip</key>
   false/>
   key>VerificationState</key>
   integer>0</integer>
   key>com.apple.backupd.HostUUID</key>
   string>00000000-0000-1000-8000-001B63B5665E</string>
/dict>
/plist>


Una vez terminado, desmontamos el disco con el comando de más abajoya podemos darle a realizar una copia de seguridad. Volverá a comprobar la integridad de la imagen, pero después empezará a copiar.

linn:/ root# hdiutil eject /dev/disk1s2
"disk1" unmounted.


Rizando el rizo.

Se me ha ocurrido otra manera de solucionar el problema: Si con los primero pasos del post no se soluciona, se puede intentar lo siguiente, aunque para ello necesitaremos bastante espacio libre en el disco duro.

** Cambiamos el nombre a nuestra imagen sparsebundle, de tal manera que no perdamos los posibles datos que aun existan.

** Realizamos una copia completa de todo el sistema; con ello creamos una nueva estructura de ficheros sparsebundle que estará en perfecto estado.

** Ahora viene la "magia": copiamos, mediante terminal, todo el contenido de la antigua imagen, a la nueva:


linn:~ i5Js$ rsync -a --progress /volume1/TimeMachine/Linn2.sparsebundle/bands/ /volume1/TimeMachine/Linn.sparsebundle/bands


Los paths son los de mi máquina, por lo que en vuestro caso deben ser distintos. La sintaxis es
rsync -a --progress

** Si la estructura de la imagen no está muy dañada (o el disco duro, claro) debería empezar a copiar todos los datos de una imagen a otra, aqui el tiempo puede variar segun el tamaño que tenga vuestro backup. Si no puede copiar nada, no hay nada que hacer, al menos que se me ocurra ahora mismo

** Cuando termine, tratais de montar la nueva imagen sparsebundle creada anteriormente que tendrá todos los datos de la anterior y los actuales. Seguramente le pase un chequeo previo, asi que puede tardar en montarla. Si lo hace satisfactoriamente enhorabuena! los datos han vuelto y vuelven a estar accesibles!!. Solo resta desmontarla y realizar una nueva copia de seguridad, que en este caso será pequeña.

Saludos!

JJJJJ/i5Js.
Ostia, menuda guía, deberias haber puesto el asunto poniendo [GUIA] al principio.
A mi me paso varias veces y simplemente he tenido que borrar...
Muy buen aporte para la proxima que me pase...
Hecho!

Espero que ayude a la gente.

Saludos.
2 respuestas