recuperar cinta parcialmente sobrescrita desde tar -c

recuperar cinta parcialmente sobrescrita desde tar -c

Tengo una situación. Se suponía que debía ejecutar tar -x para recuperar un archivo tar de una cinta pero presioné "c" y olvidé poner la cinta en modo de solo lectura. El archivo estaba en la posición 23 de fsf, pero la cinta tenía 27 archivos. Sé que el archivo 23 está perdido, pero como presioné ctrl+c para cancelar el comando tar, ¿todavía puedo esperar recuperar de alguna manera los otros archivos tar? Probé fsf pasado el archivo 23 y todo lo que obtengo es un error de entrada/salida.

Estaba pensando en hacer un volcado del archivo 23 usando dd y luego obtener este archivo y usar una herramienta de recuperación de archivos de firma, como photorec. ¿Es esto factible?

Respuesta1

Esta pregunta es completamente específica del dispositivo, según el hardware de la unidad y su controlador asociado.

Cuando se estropean las operaciones de la cinta (como interrumpir una escritura), es fácil crear un símbolo no legible o incluso un tramo no legible en la cinta. Ya ha demostrado que su controlador no es capaz de leer más allá de la basura que dejó su escritura abortada, ya que mt fsfsimplemente emite un ioctl que le pide al controlador que salte a la siguiente marca EOF. Dado que el controlador devuelve EIO, es probable que no pueda lograr que funcione mejor.

Dependiendo de lo vital que sea esta cinta para usted, el siguiente paso probablemente sea enviarla a una empresa de recuperación forense experta en el arte de las cintas magnéticas. Probablemente sus datos estén ahí, pero la mayoría de los conductores no saben cómo solucionar el defecto del marcador que usted introdujo.

Respuesta2

Intente realizar las lecturas comenzando desde el otro extremo de la cinta:

#! /bin/sh
set -e
TAPE=/dev/... # change me, you must use a non-rewinding device.
export TAPE

# Wind to the end of the tape.
mt eod

# Rewind to the beginning of the last file and then list it.
# It's possible I misunderstood the way end-of-data is signaled
# on the tape and if so perhaps this command should be mt bsfm 2,
# in which case you can just combine this with the loop below.
# For context here you can look at the entry for MT_ST_TWO_FM
# in "man st".
mt bsfm 1
tar -f "$TAPE" -t

# We just read a file so we're  going to need to rewind over it
# and then rewind more to get to the beginning of the previous file.
# I forget whether tar leaves the tape at EOF or just after it. I'm
# assuming here just after, but if it leaves the tape at the EOF
# mark, the 2 on the next line would need to be a 1.
while mt bsfm 2 
do
  tar -f "$TAPE" -t
done

Eso podríalistael contenido de todos los archivos tar a los que podemos acceder desde el final de la cinta. Por supuesto, también hay archivos al principio de la cinta, pero puedes enumerarlos mucho más fácilmente:

while tar -f "$TAPE" -t
do
  true
done

La mt eodoperación le pide al conductor que enrolle hasta el final de la cinta pasando las marcas de archivo. Esto debería funcionar bien si todo lo que hizo para interrumpir la escritura en cinta fue finalizar el proceso tar con SIGINT (Ctrl-C). Desde el punto de vista del controlador de cinta SCSI, esto parece simplemente como si el programa del espacio de usuario cerrara el descriptor de archivo, por lo que debería haber una marca EOF en ese lugar, pero ningún "daño" real.

Sin embargo, si hay algo más sucediendo aquí y/o el método anterior no funciona, es posible que pueda obtener un resultado diferente pidiendo al controlador de cinta que espacie hasta el final del medio enviando un comando SCSI a la unidad de cinta le pide que haga eso. Eso no es lo mismo que el comportamiento predeterminado (que es que el controlador de cinta, mediante el espaciado hacia adelante sobre los archivos, puede realizar un seguimiento del número de archivo actual (para informar en operaciones como mt statusy mt tell). Para configurar esto, usaría el MT_ST_FAST_EOMcomando ioctl. No sé cómo configurar eso desde la línea de comando, es posible que necesites crear un pequeño programa en C, un poco como este:

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mtio.h>

int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;
  struct mtop mt_cmd;
  mt_cmd.mt_op = MTSETDRVBUFFER;
  mt_cmd.mt_count = MT_ST_BOOLEANS | MT_ST_FAST_MTEOM;
  if (0 != ioctl(1, MTIOCTOP, &mt_cmd)) {
    perror("MTSETDRVBUFFER on stdout");
    return 1;
  }
  return 0;
}

Para guardar en formato estándar, supuse que el dispositivo de cinta ya está abierto en la salida estándar para este programa (es decir, lo ejecuta así:) ./myprog >"$TAPE".

No he probado ese código, utilícelo con precaución. Si les dice a sus hijos que pueden tener un cachorro, no me culpen. Puede utilizar otro programa C para revertir la configuración, pero también puede simplemente reiniciar la máquina si la disponibilidad continua del servicio no es un problema.

información relacionada