rm -rf 파일 복구 하기 정보
rm -rf 파일 복구 하기
본문
하다가 이상해서 중지 시켰지만..그래도 많은 파일들이 날라갔더군요
그래서 종일 검색하고 이것 저것 다 해보고...해서 나름 방법으로 올려봅니다.
----------------------------------------------------------------------------------------------------------
첫번째로 ext3grep 이라는 프로그램을 받습니다.
해당 프로그램은 파일시스템 ext3에서만 복구가 가능한 프로그램입니다. 또 한 rpm 파일도 있지만
가능하면 source compile 하세요. 제가 둘다 해봤지만..결국 source complie 해서 사용했습니다.
검색사이트에서 ext3grep 검색하시면 다운로드 가능한 곳 있습니다. 거기서 다운 받으시면 됩니다.
일단 원하는 폴더에 ext3grep.tar.gz 파일을 받습니다
tar zxvf ext3grep.tar.gz
cd ext3grep.tar.gz
./configure
make
make install 하시고...
make install 하시고 나서 해당 파일을 돌렸을 때
init_directory 어쩌고 에러가 나오면
소스에 있는 ext3grep/src에 있는
vi init_directories.cc 여시고 해당 파일을 아래와 같이 수정해주세요
534 라인 근처에..
ASSERT(lost_plus_found_directory_iter != all_directories.end()); 있는데
이걸 아래와 같이 수정 합니다.
if (lost_plus_found_directory_iter == all_directories.end())
{
--lost_plus_found_directory_iter;
std::cout << "WARNING: Cannot find lost+find directory?! Stuffing unlinkable blocks in " << lost_plus_foun d_directory_iter->first << " instead.\n";
}
그리고 저장하시고 다시 컴파일 하세요
다시 프로그램 돌리세요..
여기까지 프로그램 설치는 완료 했습니다.
두번째로 df -h 해서 지워진 해당 파티션을 찾습니다.
아마 /dev/ 어쩌고에 있을 것 입니다.
그럼 umount /dev/파티션명 해서 파티션을 umount 해주세요
* 이 작업은 작업 하기 전에 꼭 먼저 해줘야 합니다!!!!!
세번째로 아래와 같이 하세요
문서 펌 ~
얼마전에 저는 정말 절망 속에서 있었습니다.
지난 3개월간 작업한 모든 데이타를 rm -rf 로 날려버렸고.
백업도 2달 전에 해놓은거라. .;; 진짜 암담한 상황이었습니다.
몇몇 지인분들께 여쭤봐도 "포기해~ 그게 정신건강에 좋아" 라는 얘기만 들었습니다.
그러다가 보게 된.
하던중 큰 시행착오는 없었고 저 문서대로만 하면되는데.
umount 하는데 ;; 문제가 많이 발생했습니다. 아래 차근 차근 설명을 쓰겠습니다.
제가 사용하는 centOS 에서만 그런지 모르겠지만.
옵션이 "-" 문자가 아니라 "--" 문자로 해야 작동을 했습니다.
--help 쳐보면 옵션 나오죠^^
저처럼 아무것도 모르는 초짜를 위해서 말씀드리자면.
저 링크에 있는 파일 받아서 설치하기 위해선
1- ./configure (물론 압축풀린 곳에서)
2- make
3- make install
요렇고롬 해주면 됩니다.
패키지로도 되어있다고 하니깐. 우분투 패키지 관리자에서 잘 찾아보시길.
ext3grep 입니다.
설치후에 umount 해주니
device 가 아직 작동중이랍니다.
그래서 fuser -km /dev/sda6 (제 파티션 장치가 /dev/sda6입니다)
해서 연결된 장치를 지워주니 ssh 가 끊깁니다.;
원인인 즉슨, 제가 일반 유저로 로그인해서 su - 로
최고관리자 권한을 가져서 인데
이건
vi /etc/ssh/sshd_config
PermitRoot no <--- yes
/etc/init.d/sshd restart
요렇고롬 세팅 해주면 됩니다.
그런 문제없이 자연스레 umount 가 되시는 분은 그냥 넘어가십시요.
그다음 ext3grep –-dump-names --after=12146454 /dev/sda6
위의 숫자는 unix time 입니다. php에서 mktime(시,분,초,월,일,연)
해주면 쉽게 구할 수 있죠.(다른 방법있다면 그걸 선택하세요)
여튼 전 history 명령으로 제가 rm -rf 를 친 그 시점에대해서 복구하려고 위의
세팅을 맞췄습니다.
저렇게 하면 sdb1.ext3grep.stage1 와 sdb1.ext3grep.stage2
파일 비스므레한 파일이 생깁니다. ( 시간이 꽤 걸렸습니다 저는. 한시간 반정도?)
앞에껀 inode 정보 뒤에껀 디렉토리 정보죠.
사람이 읽을 수 있는건 뒤에꺼고요. 필요한건 두파일 모두입니다.
건들진 마세요. 그냥 두시면됩니다.
그다음 --restore-all 옵션과 --after 옵션으로
위에서 가져온 정보에 대해서 복구를 합니다. 다시 재차 조회해 오진 않으므로
시간소요는 적습니다.
이렇게 해서 제가 실행한 위치에 /RESTORE~~~~~ 어쩌구 폴더가 생기면서
그곳에 제 파티션의 파일들이 복구가 되었습니다. ^^ 아 사랑스러워. ^^
그 다음 다시 이 디바이스를 해당 폴더에 mount 시켜주고 복구된 파일을 /RESTORE 에서
원래의 장소로 복사해주면 끝.
정말...ㅜ.ㅜ 눈물을 머금고 처음부터 재작업을 하려고 했는데
이런걸 알게되다니... 위의 글을 써주신 분께 다시한번 감사를.
설명이 좀 부족해서 말이 엉킬수도 있겠네요.
여튼. ^^ 도움이되셨으면 좋겠습니다.
Fedora 10 패키지 목록을 살펴보던 중 호기심을 자극하는 패키지가 하나 있었다. 뭔가하고 살펴보니 ext3 파일 시스템에서 지워진 파일의 복구를 해주는 놈이다.
ext2와 다른 특성으로 인해 ext3에서 지워진 파일의 복구는 꽤 어려운 명령어들을 알아야했고 복구율도 좋지 않았었다. 하지만 ext3grep은 이러한 생각을 바꾸게 만들기에 충분했다.
소스 다운로드는 http://code.google.com/p/ext3grep/ 에서 할 수 있고 Fedora나 Debian의 최신 버전에는 포함되어 있으니 해당 배포판의 패키지 관리자로 설치하면 된다.
설치를 하고 간단한 테스트를 해보았다. 시간상 1GB정도의 파티션을 만들고 테스트를 진행했다.
# mkfs.ext3 /dev/sdb1 # mount /dev/sdb1 /mnt/test/ # df -h /dev/sdb1 966M 18M 899M 2% /mnt/test
몇개의 디렉토리와 파일을 만들었다.
# ls * test1.txt test2.txt 테스트.txt 테스트2.txt dir1: dir1.txt dir2: dir2.txt dir3: dir3.txt lost+found: 디렉토리1: 디렉토리1.txt 디렉토리2: 디렉토리2.txt 디렉토리3: 디렉토리3.txt
그 중에 몇개를 삭제했다.
# rm -rf dir2 dir3 test2.txt 디렉토리1 디렉토리3 테스트.txt
이제 unmount 하고 실제 ext3grep 을 사용할 차례다.
# umount /mnt/test
–dump-names 로 경로를 포함한 파일들의 경로를 알 수 있다.
# ext3grep –dump-names /dev/sdb1 Running ext3grep version 0.10.1 Number of groups: 8 Minimum / maximum journal block: 562 / 4664 Loading journal descriptors… sorting… done The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009 Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40 Finding all blocks that might be directories. D: block containing directory start, d: block containing more directory entries. Each plus represents a directory start that references the same inode as a directory start that we found previously. Searching group 0: DDD+DD+++++++++++++++++D+DD+++++++++ Searching group 1: + Searching group 2: + Searching group 3: + Searching group 4: + Searching group 5: + Searching group 6: + Searching group 7: Writing analysis so far to ’sdb1.ext3grep.stage1′. Delete that file if you want to do this stage again. Result of stage one: 8 inodes are referenced by one or more directory blocks, 4 of those inodes are still allocated. 7 inodes are referenced by more than one directory block, 3 of those inodes are still allocated. 0 blocks contain an extended directory. Result of stage two: 4 of those inodes could be resolved because they are still allocated. 4 inodes could be resolved because all refering blocks but one were journal blocks. All directory inodes are accounted for! Writing analysis so far to ’sdb1.ext3grep.stage2′. Delete that file if you want to do this stage again. dir1 dir1/.dir1.txt.swp dir1/dir1.txt dir2 dir2/.dir2.txt.swp dir2/dir2.txt dir3 dir3/.dir3.txt.swp dir3/dir3.txt lost+found test1.txt test2.txt 디렉토리1 디렉토리1/.디렉토리1.txt.swp 디렉토리1/디렉토리1.txt 디렉토리2 디렉토리2/.디렉토리2.txt.swp 디렉토리2/디렉토리2.txt 디렉토리3 디렉토리3/.디렉토리3.txt.swp 디렉토리3/디렉토리3.txt 테스트.txt 테스트2.txt
위 명령어를 실행한 후 ext3grep.stage1, ext3grep.stage2 파일이 생성되는데 inode와 block의 정보를 담고 있다. 한번 생성되면 다른 명령어를 실행할때 재사용되기 때문에 검색에 소요되는 시간이 줄어든다.
# cat sdb1.ext3grep.stage1 # Stage 1 data for /dev/sdb1. # Inodes and directory start blocks that use it for dir entry ‘.’. # INODE : BLOCK [BLOCK ...] 2 : 556 573 597 605 610 682 688 698 703 713 719 732 859 11 : 557 15713 : 740 792 800 805 40960 31425 : 582 659 666 671 79872 47137 : 571 620 628 633 112640 62849 : 578 645 651 145408 78561 : 736 774 780 172032 94273 : 730 749 757 762 204800 # Extended directory blocks. # END # cat sdb1.ext3grep.stage2 # Stage 2 data for /dev/sdb1. # Inodes path and directory blocks. # INODE PATH BLOCK [BLOCK ...] 2 ” 556 11 ‘lost+found’ 557 15713 ‘디렉토리3′ 40960 31425 ‘dir3′ 79872 47137 ‘dir1′ 112640 62849 ‘dir2′ 145408 78561 ‘디렉토리2′ 172032 94273 ‘디렉토리1′ 204800 # END
–restore-all 은 해당 장치의 모든 파일을 명령어가 실행된 위치에 RESTORED_FILES라는 디렉토리를 생성하고 그 안에 복구해준다. 명령어를 실행하기 전에 충분한 공간이 있는지 확인하자.
# ext3grep –restore-all /dev/sdb1 Running ext3grep version 0.10.1 Number of groups: 8 Minimum / maximum journal block: 562 / 4664 Loading journal descriptors… sorting… done The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009 Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40 Writing output to directory RESTORED_FILES/ Finding all blocks that might be directories. D: block containing directory start, d: block containing more directory entries. Each plus represents a directory start that references the same inode as a directory start that we found previously. Searching group 0: DDD+DD+++++++++++++++++D+DD+++++++++ Searching group 1: + Searching group 2: + Searching group 3: + Searching group 4: + Searching group 5: + Searching group 6: + Searching group 7: Writing analysis so far to ’sdb1.ext3grep.stage1′. Delete that file if you want to do this stage again. Result of stage one: 8 inodes are referenced by one or more directory blocks, 4 of those inodes are still allocated. 7 inodes are referenced by more than one directory block, 3 of those inodes are still allocated. 0 blocks contain an extended directory. Result of stage two: 4 of those inodes could be resolved because they are still allocated. 4 inodes could be resolved because all refering blocks but one were journal blocks. All directory inodes are accounted for! Writing analysis so far to ’sdb1.ext3grep.stage2′. Delete that file if you want to do this stage again. Restoring dir1/.dir1.txt.swp Restoring dir1/dir1.txt Restoring dir2/.dir2.txt.swp Restoring dir2/dir2.txt Restoring dir3/.dir3.txt.swp Restoring dir3/dir3.txt Restoring test1.txt Restoring test2.txt Restoring 디렉토리1/.디렉토리1.txt.swp Restoring 디렉토리1/디렉토리1.txt Restoring 디렉토리2/.디렉토리2.txt.swp Restoring 디렉토리2/디렉토리2.txt Restoring 디렉토리3/.디렉토리3.txt.swp Restoring 디렉토리3/디렉토리3.txt Restoring 테스트.txt Restoring 테스트2.txt # cd RESTORED_FILES/ # ls * test1.txt test2.txt 테스트.txt 테스트2.txt dir1: dir1.txt dir2: dir2.txt dir3: dir3.txt lost+found: 디렉토리1: 디렉토리1.txt 디렉토리2: 디렉토리2.txt 디렉토리3: 디렉토리3.txt
–restore-all 명령어와 함께 사용할 수 있는 필터가 여러개 있는데 –after 옵션을 주면 그 시간 이후의 파일들만 복구해준다. unix time을 적어주면 된다.
# ext3grep –restore-all –after=1235694514 /dev/sdb1 Running ext3grep version 0.10.1 Only show/process deleted entries if they are deleted on or after Fri Feb 27 09:28:34 2009. Number of groups: 8 Minimum / maximum journal block: 562 / 4664 Loading journal descriptors… sorting… done The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009 Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40 Loading sdb1.ext3grep.stage2… done Not undeleting “dir1/.dir1.txt.swp” because it was deleted before 1235694514 (32767) Restoring dir1/dir1.txt Not undeleting “dir2/.dir2.txt.swp” because it was deleted before 1235694514 (1235694303) Not undeleting “dir2/dir2.txt” because it was deleted before 1235694514 (1235694303) Not undeleting “dir3/.dir3.txt.swp” because it was deleted before 1235694514 (1235694303) Not undeleting “dir3/dir3.txt” because it was deleted before 1235694514 (1235694303) Restoring test1.txt Not undeleting “test2.txt” because it was deleted before 1235694514 (1235694287) Not undeleting “디렉토리1/.디렉토리1.txt.swp” because it was deleted before 1235694514 (1235694287) Not undeleting “디렉토리1/디렉토리1.txt” because it was deleted before 1235694514 (1235694287) Not undeleting “디렉토리2/.디렉토리2.txt.swp” because it was deleted before 1235694514 (1235694287) Restoring 디렉토리2/디렉토리2.txt Not undeleting “디렉토리3/.디렉토리3.txt.swp” because it was deleted before 1235694514 (1235694404) Not undeleting “디렉토리3/디렉토리3.txt” because it was deleted before 1235694514 (1235694404) Not undeleting “테스트.txt” because it was deleted before 1235694514 (1235694404) Restoring 테스트2.txt
특정 이름의 파일만 복구 하려면 –restore-file 다음에 파일명을 써주면 된다.
# ext3grep –restore-file 테스트.txt /dev/sdb1 Running ext3grep version 0.10.1 Number of groups: 8 Minimum / maximum journal block: 562 / 4664 Loading journal descriptors… sorting… done The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009 Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40 Writing output to directory RESTORED_FILES/ Loading sdb1.ext3grep.stage2… done Restoring 테스트.txt # cd RESTORED_FILES/ # ls 테스트.txt
디렉토리 밑에 있는 파일이라면 경로까지 정확하게 써주면 된다. 경로를 포함한 파일명은 위에서 한번 실행했던 –dump-names로 알 수 있다.
# ext3grep –restore-file dir2/dir2.txt /dev/sdb1 Running ext3grep version 0.10.1 Number of groups: 8 Minimum / maximum journal block: 562 / 4664 Loading journal descriptors… sorting… done The oldest inode block that is still in the journal, appears to be from 1235694214 = Fri Feb 27 09:23:34 2009 Number of descriptors in journal: 269; min / max sequence numbers: 2 / 40 Loading sdb1.ext3grep.stage2… done Restoring dir2/dir2.txt
더 많은 옵션이 있지만 일반적인 사용자라면 이정도만 알아도 충분히 복구할 수 있을 것이다. 이름처럼 ext3에 대해서 복구를 해주기 때문에 포맷이 되었거나 다른 파일시스템에서는 복구가 안된다.
마지막으로 노파심에서 한마디 하자면 실수로 파일을 삭제했을때에는 최대한 빨리 해당 장치를 unmount 해서 덮어써지지 않게 해야한다.
여기까지는 이렇게 작업하시면 됩니다.
0
댓글 3개

