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

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

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

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

답변1

이 문제는 전적으로 장치에 따라 다르며 드라이브 하드웨어 및 관련 드라이버에 따라 다릅니다.

테이프 작업을 망칠 때(예: 쓰기 중단) 테이프에 읽을 수 없는 기호나 읽을 수 없는 스트레치가 쉽게 생길 수 있습니다. mt fsf단 하나의 ioctl을 발행하려면 드라이버가 다음 EOF 마커로 점프해야 하기 때문에 드라이버가 중단된 쓰기로 인해 남겨진 쓰레기를 읽을 수 없다는 것을 보여주었습니다 . 드라이버가 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 tellMT_ST_FAST_EOM

#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 프로그램을 사용하여 설정을 되돌릴 수 있지만, 지속적인 서비스 가용성이 문제가 되지 않으면 간단히 컴퓨터를 재부팅할 수도 있습니다.

관련 정보