답변1
대답은 "아마도 그렇습니다. 하지만 파일 시스템 유형과 시간에 따라 다릅니다."입니다.
실수를 제외하고는 이 세 가지 예제 중 어느 것도 old_file 또는execution_file의 물리적 데이터 블록을 덮어쓰지 않습니다.
mv new_file old_file
. 그러면 old_file의 연결이 해제됩니다. old_file에 대한 다른 하드 링크가 있는 경우 나머지 링크의 블록은 변경되지 않은 상태로 유지됩니다. 그렇지 않으면 이러한 블록은 일반적으로 (파일 시스템 유형에 따라) 사용 가능 목록에 배치됩니다. 그런 다음 복사가 필요한 경우mv
(디렉터리 항목을 이동하는 것이 아니라) 새 블록이mv
쓰기로 할당됩니다.새로 할당된 블록방금 공개된 것과 동일할 수도 있고 다를 수도 있습니다.. 이와 같은 파일 시스템에서초고속 파일 시스템, 가능하다면 파일이 생성된 디렉토리와 동일한 실린더 그룹의 블록을 할당하십시오. 따라서 디렉터리에서 파일 링크를 해제하고 동일한 디렉터리에 파일을 생성하면 방금 해제된 동일한 블록 중 일부를 재사용(및 덮어쓰기)할 가능성이 있습니다. 이것이 실수로 파일을 삭제한 사람들을 위한 표준 조언이 누군가가 파일 복구를 시도할 때까지 디렉터리 트리의 파일에 새 데이터를 쓰지 말라는 것입니다(전체 파일 시스템에 쓰지 않는 것이 좋습니다).
cp new_file old_file
다음을 수행합니다(이를 사용하여strace
시스템 호출을 볼 수 있습니다).열기("이전 파일", O_WRONLY | O_TRUNC) = 4
mv
O_TRUNC 플래그는 위에서 수행한 것과 마찬가지로 모든 데이터 블록을 해제합니다 . 위에서 언급한 것처럼 일반적으로 사용 가능 목록에 추가되며 명령 완료 시 후속 쓰기에서 재사용될 수도 있고 그렇지 않을 수도 있습니다cp
.vi existing_file
.vi
실제로 그렇다면 명령vim
은:x
다음을 수행합니다.unlink("existing_file~") = -1 ENOENT (해당 파일이나 디렉터리 없음)
rename("기존 파일", "기존 파일~") = 0
open("기존 파일", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
따라서 기존 데이터는 삭제되지 않고 백업 파일에 저장됩니다.
FreeBSD에서
vi
yes는open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
위와 같은 의미를 갖습니다cp
.
데이터의 일부 또는 전부를 복구하는 데 특별한 절차가 필요하지 않습니다. 필요한 것은 원래 장치에 액세스하는 grep
것뿐입니다 .dd
작은 텍스트 파일의 경우 grep
,@Steven D의 답변귀하가 연결한 질문에서 가장 간단한 방법은 다음과 같습니다.
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
그러나 여러 개의 연속되지 않은 청크에 있을 수 있는 더 큰 파일의 경우 다음을 수행합니다.
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
그러면 일치하는 행의 오프셋(바이트)이 제공됩니다. 다음 dd
으로 시작하여 일련의 명령을 실행하십시오.
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
또한 이 블록 앞과 뒤의 일부 블록을 읽고 싶습니다. UFS에서 파일 블록은 일반적으로 8KB이며 일반적으로 개별 파일의 블록이 다른 파일이나 사용 가능한 공간의 8KB 블록과 인터리브되어 꽤 연속적으로 할당됩니다. UFS의 파일 끝에는 최대 7개의 1KB 조각이 있으며 이러한 조각은 연속적일 수도 있고 그렇지 않을 수도 있습니다.
물론 데이터를 압축하거나 암호화하는 파일 시스템에서는 복구가 그렇게 간단하지 않을 수 있습니다.
실제로 Unix에는 기존 파일 블록을 덮어쓰는 유틸리티가 거의 없습니다. 떠오르는 것은 입니다 dd conv=notrunc
. 다른 하나는 입니다 shred
.
답변2
/var/tmp 또는 더 큰 위치에 충분한 디스크 공간이 있는지 확인하십시오.
노력하다
grep -i -a -B100 -A100 'a string unique to your file' /dev/sda1 |
strings > /var/tmp/my-recovered-file
여기서 /dev/sda1은 시스템의 디스크입니다.
그런 다음 my-recovered-file에서 문자열을 검색하세요.
그것가능한대부분은 거기에 있습니다. 줄 간격, 대괄호, 기호 등이 누락되었는지 확인하세요.
파일의 데이터 양을 줄이려면 파일에서 상당히 고유한 검색어나 문자열을 사용하십시오. "echo"와 같은 단어를 검색하면 시스템에 echo라는 단어가 포함된 많은 파일이 있기 때문에 많은 문자열을 얻게 됩니다.
답변3
저는 아니오라고 대답하겠습니다(큰 별표 표시).
데이터가 디스크에 어떻게 저장되는지 생각해 보세요. 데이터를 포함하고 다음 블록(있는 경우)을 가리키는 블록이 있습니다.
데이터를 덮어쓰면 블록 내용(또는 파일을 확장하는 경우 닫는 태그)이 변경됩니다. 그래서 아무것도~해야 한다복구가 가능합니다(아래 참조).
파일을 줄이면 오래된 블록이 손실되고 매우 빠르게 재활용됩니다. 당신이 프로그래머라면, 해제/삭제 작업을 수행하지 않고 목록의 절반을 "잃어버리는" 연결 목록을 고려해 보십시오. 데이터는 여전히 존재하지만, 행운을 빌어요.
생각해보면 흥미로울 수 있는 것은 단편화(fragmentation)입니다.
조각화는 불연속적인 데이터가 있는 디스크에 "구멍"이 있을 때 발생합니다. 이는 디스크의 원래 위치에 더 이상 맞지 않도록 파일을 늘리거나 줄이는 등의 파일 수정으로 인해 발생할 수 있습니다.
파일이 원래 크기(이동해야 하는 시점)를 초과하는 경우 파일 시스템에 따라 전체 파일을 이전 데이터가 아직 남아 있는 새 위치(무료로 표시됨)에 복사하거나 이전 끝 포인터를 변경하고 새 위치를 가리키도록 만들 수 있습니다(이로 인해 지터가 발생함).
간단히 말해서, 현미경으로 관찰하는 극단적인 법의학 과정을 거치지 않고 데이터가 손실될 수 있지만 여전히 데이터가 남아 있을 가능성이 있습니다.
답변4
나도 같은 상황에 처해 있었습니다. "mv FILE1.c FILE2.c"를 실행했습니다.
"Linux 시스템에 특수 프로그램이 설치되어 있지 않음"을 요청하셨습니다. 다른 시스템에 이러한 도구를 설치하거나 livedisk를 사용하면 이를 달성할 수 있습니다.
디스크에 대한 쓰기 중지 또는 제한
이 경우 보존하려는 데이터를 실제로 덮어쓸 수 있으므로 현재 시스템에 대한 쓰기를 제한하는 것이 가장 좋습니다.
그러니 우선 데이터가 저장된 컴퓨터에서 웹을 탐색하지 마시길 바랍니다!
어떤 경우에는 프로세스 중에 파일이 여전히 열려 있을 수 있습니다. 이것이 사실이라고 생각한다면 아직 기계를 멈추지 마십시오. 데이터에 대한 핸들을 찾기 전에 파일을 열어 둔 프로세스를 절전 모드로 전환할 수 있습니다. 이 경우 기계를 정지할 필요가 없습니다. 적어도 하나의 다른 답변이 이 방법을 지적했습니다. 파일은 일반적으로 해당 디렉토리에 잘못된 이름을 갖습니다(보기를 사용하십시오 ls -lart
. 가장 최근 파일이 마지막에 표시되며 날짜는 가장 좋은 추측에 대한 힌트를 제공할 수 있습니다).
복구 시스템 사용
그런 다음 우선순위에 따라 다음 중 하나를 수행합니다.
디스크를 다른 컴퓨터에 삽입하거나 다른 파티션, USB 플래시 드라이브 또는 Live CD에서 부팅할 수 있는 경우:
기계를 멈추고 귀하(및 귀하의 시스템)가 괜찮다면 간단히 배터리를 뽑거나 켜기/끄기 버튼을 길게 눌러 끄십시오.
정전이 완전히 발생하면 필요한 파일을 덮어쓸 위험이 높아집니다.
다른 시스템을 부팅할 수 없는 경우: 시스템에 대한 쓰기를 제한합니다. 디스크에 쓸 수 있는 프로그램을 종료합니다.
"photorec"은 "testdisk"와 함께 설치됩니다.
대부분의 경우 "testdisk"를 사용합니다. 제가 모르는 다른 방법이 있는지 확인하다가 이 페이지를 방문하게 되었습니다.
"testdisk"는 Ubuntu 16.04 시스템에 항상 사전 설치하는 도구 세트입니다(합당한 이유로 "레거시").
"Linux 시스템에 특수 프로그램이 설치되어 있지 않음"을 요청합니다. 다른 시스템에 "testdisk"를 설치하고 거기에서 원시 디스크를 읽을 수 있습니다. USB 디스크에서 부팅할 수도 있습니다.
그렇게 할 수 없다면 현재 시스템에 설치할 수 있습니다. 이런 경우에는 얼마 전에 다운로드한 대용량 ZIP이나 ISO 등 오래된 대용량 파일을 삭제하는 것이 좋습니다. 가장 최근 데이터가 디스크의 시작 부분이 아닌 끝 부분에 있는 경향이 있다고 생각하기 때문에 이렇게 합니다.
그런 다음 다음과 같은 것을 사용하여 "testdisk"를 설치할 수 있습니다(예: debian):
apt-get install testdisk
그런 다음 "photorec"을 시작하고 데이터가 있는 장치(파티션)가 아닌 다른 장치(파티션)에 파일을 복원하도록 합니다. 어떤 경우에는 USB 드라이브, 네트워크 드라이브 또는 /tmp 디렉터리(RAM에 매핑된 경우)일 수도 있습니다.
photorec /d PATH_TO_OTHER_DEVICE
복구하려는 장치를 선택한 후, 하단 메뉴에서 "[파일 옵션]"을 선택하세요. 그런 다음 모든 옵션을 선택 취소하고 찾고 있는 파일 형식만 선택하세요. 제 경우에는 "C" 파일이므로 "텍스트"를 선택했습니다. photorec
여전히 .c
찾은 파일을 생성합니다. 그런 다음 우주 [Search]
에서만 실행 하고 볼 수 있습니다 Free
.
다시 실행되어 다음 명령을 실행했습니다.
grep minTemp recup*/*.c
photorec이 복구 디렉터리를 생성하는 경로에 있습니다. 내 파일에 "minTemp"가 있다는 것을 알고 있으며 ac 파일을 찾고 있습니다.
파일의 다양한 버전에 대해 30개의 항목이 있으며 더 큰 항목을 먼저 확인했습니다.
photorec
계속 실행 중이지만 이제 "minTemp"에 대한 새로운 일치 항목이 있으므로 필요한 파일이 있다고 확신하여 프로세스를 중지했습니다.
해외 서비스
귀하의 전문 지식에 따라 작업을 하청할 수도 있습니다. 데이터 복구를 전문으로 하는 회사가 많이 있습니다. 그들은 디스크에 어떤 도구도 설치하지 않습니다. 하청업체가 데이터를 복원할 수 있는 경우 최소 비용은 약 $500입니다.
준비하다
이 상황에 더 잘 대비하려면 준비하세요! :
- 데이터가 발생하기 전에 복구하는 방법을 알아보고 복구가 필요하지 않은 경우 일부 데이터를 복구해 보십시오.
- 필요하기 전에 시스템에 "testdisk"를 설치하십시오(testdisk를 설치하면 이미 설치되어 있으므로 데이터를 덮어쓰지 않습니다).
- 데이터를 시스템 파일과 별도의 파티션에 보관하십시오. 일부는 /tmp 디렉토리에 별도의 파티션을 사용하도록 권장하기도 합니다.
- 스냅샷을 사용하세요. 스냅샷 도구(rsnapshot)를 사용하여 "장치" 수준(zfs/btrfs)에서 또는 일부 이전 파일 버전을 유지할 수 있는 프라이빗 클라우드에서도 이 작업을 수행할 수 있습니다. 이러한 기능이 통합된 NAS 시스템도 있습니다(".snapshot" 디렉터리에서 이전 버전을 찾을 수 있습니다.
- ShadowProtect 및 Acronis와 같은 백업 도구를 사용하면 온라인 디스크의 증분 백업을 자주 수행할 수 있습니다.
- 복구 도구와 적절한 라이브 운영 체제가 포함된 USB 드라이브를 준비하세요. [나는 하나를 가지고 다닙니다].