tar -c에서 부분적으로 덮어쓴 테이프 복구

tar -c에서 부분적으로 덮어쓴 테이프 복구

상황이 있습니다. 테이프에서 tar 파일을 복구하기 위해 tar -x를 실행해야 했지만 "c"를 누르고 테이프를 읽기 전용으로 설정하는 것을 잊어버렸습니다. 파일은 fsf 위치 23에 있었지만 테이프에는 27개의 파일이 있었습니다. 파일 23이 손실되었다는 것을 알고 있지만 tar 명령을 취소하기 위해 ctrl+c를 눌렀으므로 어떻게든 다른 tar 파일을 복구할 수 있을까요? 파일 23을 지나서 fsf를 시도했는데 내가 얻은 것은 입력/출력 오류뿐입니다.

나는 dd를 사용하여 파일 23에서 덤프를 수행한 다음 이 파일을 가져오고 photorec과 같은 서명 파일 복구 도구를 사용할 것이라고 생각했습니다. 이것이 가능합니까?

답변1

이 질문은 드라이브 하드웨어 및 관련 드라이버에 따라 완전히 장치별로 다릅니다.

테이프 작업을 방해하면(예: 쓰기 중단) 쉽게 읽을 수 없는 기호를 만들거나 테이프에 읽을 수 없는 스트레치를 만들 수 있습니다. mt fsf드라이버가 다음 EOF 표시로 건너뛰도록 요청하는 ioctl을 발행하기 때문에 중단된 쓰기가 남긴 정크를 지나서 읽을 수 없다는 것을 이미 보여주었습니다 . 드라이버가 EIO를 반환하므로 더 나은 성능을 발휘할 수 없을 가능성이 높습니다.

이 테이프가 귀하에게 얼마나 중요한지에 따라 다음 단계는 아마도 테이프 기술에 능숙한 법의학 복구 회사에 테이프를 보내는 것일 것입니다. 귀하의 데이터는 아마도 거기에 있을 것입니다. 그러나 대부분의 운전자는 귀하가 초래한 마커 결함에 대처하는 방법을 모릅니다.

답변2

테이프의 반대쪽 끝부터 읽기를 시작해 보십시오.

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

그럴 것이다목록테이프 끝에서 접근할 수 있는 모든 tar 아카이브의 내용. 물론 테이프 시작 부분에 아카이브도 있지만 훨씬 더 쉽게 나열할 수 있습니다.

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

mt eod작업은 드라이버에게 과거 파일 표시를 감아 테이프 끝까지 감도록 요청합니다. 테이프 쓰기를 중단하기 위해 SIGINT(Ctrl-C)를 사용하여 tar 프로세스를 종료하는 것뿐이라면 이 작업은 제대로 작동합니다. SCSI 테이프 드라이버의 관점에서 이것은 사용자 공간 프로그램이 파일 설명자를 닫은 것처럼 보이므로 해당 지점에 EOF 표시가 있어야 하지만 실제 "손상"은 없습니다.

그러나 여기에 다른 문제가 발생하거나 위의 접근 방식이 작동하지 않는 경우 테이프 드라이버에 SCSI 명령을 전송하여 미디어 끝 부분까지 공간을 확보하도록 요청하여 다른 결과를 얻을 수 있습니다. 테이프 드라이브가 그렇게 하도록 요청합니다. 이는 기본 동작(테이프 드라이버가 파일 위에 공백을 두어 현재 파일 번호를 추적할 수 있음( mt status및 같은 작업에서 보고 mt tell)과 동일하지 않습니다. 이를 구성하려면 ioctl을 사용합니다 MT_ST_FAST_EOM. 명령줄에서 이를 설정하는 방법을 모르겠습니다. 다음과 같이 작은 C 프로그램을 만들어야 할 수도 있습니다.

#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;
}

상용구를 절약하기 위해 테이프 장치가 이 프로그램의 표준 출력에 이미 열려 있다고 가정했습니다(즉, 다음과 같이 실행합니다: ./myprog >"$TAPE").

나는 해당 코드를 테스트하지 않았으므로 주의해서 사용하시기 바랍니다. 자녀에게 강아지를 가질 수 있다고 말한다면 나를 비난하지 마십시오. 다른 C 프로그램을 사용하여 설정을 되돌릴 수 있지만 지속적인 서비스 가용성이 문제가 되지 않는다면 간단히 시스템을 재부팅할 수도 있습니다.

관련 정보