btrfs 파티션에서 파일을 삭제 취소하는 방법은 무엇입니까?


19

btrfs 파티션에서 삭제 된 파일을 삭제 취소 (복구)하려면 어떻게합니까?

아직 스냅 샷을 만들지 않았으므로 해당 기능을 사용할 수 없습니다. 다른 Linux 파일 시스템을위한 몇 가지 도구 가 있다는 것을 알고 있지만 Google은 btrfs와 관련된 것을 설정하지 않았습니다. btrfs에 삭제 취소 도구가 포함되어 있다는 모호한 언급이 있었지만 찾을 수 없습니다. 다른 파일 시스템을위한 도구를 사용하기 전에 여기에 묻습니다.

더 많은 정보:

  • 삭제 된 파일 두 개가 원격 rsync명령에 의해 삭제되었습니다 .
  • 이것들은 작은 일반 텍스트 파일이었습니다.
  • 파일 이름을 알고 있습니다.
  • 파일의 일부 문자열을 기억할 수 있습니다.
  • 디스크는 일반 HDD이지만 대용량 (2TB)입니다.
  • 모든 최신 업데이트로 Kubuntu 12.04 (beta2)를 실행하고 있습니다.
  • 파일이 삭제 된 파티션에 새 데이터를 쓰지 않았습니다.
  • 이 파일의 스냅 샷이나 백업이 없습니다. (마지막 백업은이 파일들보다 몇 시간 더 오래되었습니다.)
  • 이상하게도, COW 파일 시스템은 ext3 / 4보다 파일 삭제 취소 옵션이 적습니다 ...

답변:


7

파일이 작고 평범한 텍스트이므로 "문자열"의 출력을 파일 시스템이있는 장치로 스캔하려고합니다.

strings /dev/sda1 | less

그런 다음 "/"를 사용하여 해당 파일에있을 수있는 문자열을 검색하십시오. 텍스트를 찾으면 "m"으로 시작을 구분 한 다음 끝으로 이동하여 "| cat> file"을 사용하여 파일에 저장하십시오.

실제로 몇 년 전에 삭제 취소없이 다른 파일 시스템에서 비슷한 상황이 발생했을 때 실제로 효과적이었습니다.


4

Jörg Walter btrfs-undeletefind-root및의 restore도구를 사용하여 쉘 스크립트를 구현 했으며 btrfs-progs,이 도구는 여기 에서 찾을 수 있으며 유사한 위치에있는 다른 사람들을 도와야합니다.

GPLv2에 따라 라이센스가 부여되었으므로 여기에 포함시킬 수 없습니다.


3
주목할 점은, 상기 스크립트는 하드 코딩 된 적어도 하나의 경로 (아마도 실수로)가 있고 다른 문제가 있기 때문에 구매자는 사용하기 전에 편집해야한다는 점에주의해야합니다.
gamen

2
다음은 원래 스크립트의 정리 된 버전입니다. gist.github.com/Changaco/45f8d171027ea2655d74
Changaco

"GPLv2에 따라 라이센스가 부여되었으므로 여기에 포함시킬 수 없습니다."-GPLv2의 내용을 읽어야합니다.
slang

4
@slang 어쩌면이 사이트의 서비스 약관을 읽어야합니까? 기고 물은 Creative Commons Attribution Share Alike 3.0 라이센스에 따라 라이센스가 부여되어야합니다.
suriv

@ suriv-그 이유를 이해할 수 있다고 생각하지만 꽤 성가신 일입니다. 특히 CC-BY-SA는 GPL (GPLv3 특허 항목 제외)보다 GPL보다 약간 더 제한적이기 때문입니다.
Omnifarious

2

btrfs 드라이브에 하위 볼륨이있는 경우 추가 -r <subvol-id>옵션을 에 전달해야 합니다 btrfs restore. 불행히도 거기에 게시 된 user414471 ( http://oelkers.de/tips/undeleteBtrfs.sh ) 과 같은 스크립트는이 작업을 수행 할 수있는 옵션이 없지만 아마도 이것에 적응할 수 있습니다.

이 작업을 직접 수행하려면 다음을 사용하여 올바른 subvol-id를 얻어야합니다.

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

또는 대안으로 :

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

그런 다음 btrfs-find-root되돌리려는 블록 번호 (일반적으로 현재 루트 인 최대 블록 바로 앞의 번호)를 얻는 데 사용 합니다. 이를 위해 먼저 기본 하위 볼륨을 파일을 되돌리려는 볼륨으로 설정하고 나중에이 변경 사항을 되돌려 야합니다.

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

드디어 사용할 수 있습니다 btrfs restore-r <subvol-id>합니다 (로 초기 복구를 위해 --dry-run원하는 경우 인수) :

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

이 모든 것에 대한 자세한 정보는 https://btrfs.wiki.kernel.org/index.php/Restore


이를 Fedora 26 시스템에서 테스트했으며 btrfs-find-root단계가 종료되지 않습니다 (예 : <250 GB FS에서 3 시간 동안 100 % CPU에서 실행). 비슷한 이야기 spinics.net/lists/linux-btrfs/msg61361.html 도 참조하십시오 .
maxschlepzig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.