recuperar fita parcialmente substituída de tar -c

recuperar fita parcialmente substituída de tar -c

Eu tenho uma situação. Eu deveria executar tar -x para recuperar um arquivo tar de uma fita, mas pressionei "c" e esqueci de colocar a fita somente leitura. O arquivo estava na posição 23 do fsf, mas a fita tinha 27 arquivos. Eu sei que o arquivo 23 está perdido, mas como pressionei ctrl+c para cancelar o comando tar, ainda posso recuperar de alguma forma os outros arquivos tar? Tentei fsf após o arquivo 23 e tudo que recebo é um erro de entrada/saída.

Eu estava pensando em fazer um dump do arquivo 23 usando dd e depois pegar esse arquivo e usar uma ferramenta de recuperação de arquivo de assinatura, como o photorec. Isso é factível?

Responder1

Esta questão é completamente específica do dispositivo, dependendo do hardware da unidade e do driver associado.

Ao estragar as operações da fita (como interromper uma gravação), você pode facilmente criar um símbolo ilegível ou até mesmo um trecho ilegível na fita. Você já mostrou que seu driver não é capaz de ler além do lixo que sua gravação abortada deixou, pois mt fsfapenas emite um ioctl que pede ao driver para pular para a próxima marca EOF. Como o driver retorna EIO, você provavelmente não conseguirá fazer melhor.

Dependendo da importância dessa fita para você, o próximo passo provavelmente será enviá-la para uma empresa de recuperação forense especializada na arte de fitas magnéticas. Seus dados provavelmente estão lá, mas a maioria dos motoristas não sabe como lidar com o defeito do marcador que você introduziu.

Responder2

Tente fazer as leituras começando do outro lado da fita:

#! /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

Isso irialistao conteúdo de todos os arquivos tar que podemos acessar no final da fita. É claro que também existem arquivos no início da fita, mas você pode listá-los com muito mais facilidade:

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

A mt eodoperação pede ao driver para enrolar até o final da fita passando pelas marcas de arquivo. Isso deve funcionar bem se tudo o que você fez para interromper a gravação da fita foi encerrar o processo tar com SIGINT (Ctrl-C). Do ponto de vista do driver de fita SCSI, parece que o programa do espaço do usuário fechou o descritor de arquivo, portanto deve haver uma marca EOF naquele local, mas nenhum "dano" real.

No entanto, se houver algo mais acontecendo aqui e/ou a abordagem acima não funcionar, você poderá obter um resultado diferente solicitando ao driver de fita que espace até o final da mídia enviando um comando SCSI para a unidade de fita pedindo para fazer isso. Isso não é o mesmo que o comportamento padrão (que é que o driver de fita encaminha o espaçamento entre os arquivos, para que ele possa acompanhar o número do arquivo atual (para relatar em operações como mt statuse mt tell). Para configurar isso, você usaria o MT_ST_FAST_EOMioctl. Não sei como definir isso na linha de comando, talvez seja necessário criar um pequeno programa em C, mais ou menos assim:

#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 economizar no padrão, presumi que o dispositivo de fita já estivesse aberto no stdout para este programa (ou seja, você o executa assim: ./myprog >"$TAPE").

Eu não testei esse código, use com cuidado. Se diz aos seus filhos que eles podem ter um cachorrinho, não me culpe. Você pode usar outro programa C para reverter a configuração, mas também pode simplesmente reiniciar a máquina se a disponibilidade contínua do serviço não for uma preocupação.

informação relacionada