리눅스에서 실수로 삭제한 파일을 복구하는 방법입니다.
한 가지 중요한 사항으로 삭제된 파일을 복구하기 위한 전제 조건은
삭제하였던 파일이 있었던 하드디스크의 섹터 부분이 다른 파일로
덮어 씌워지기 전에 복구해야 된다는 것입니다.
1. 파일 복구 프로그램 설치
1) tct 다운로드
http://www.porcupine.org/forensics/tct.html
2) 설치
# tar zxvf tct-1.16.tar.gz
# cd tct-1.16
# vi src/fstools/mylseek.c 파일을 열어 #include <errno.h> 추가
# make
2. 파일 복구 테스트
예시:
grub.conf 파일을 /tmp/grub 로 복사후 삭제한 다음 복구가 되는지 테스트해 보았습니다.
1) 삭제후 복구할 테스트 파일(grub.conf)을 /tmp 디렉토리로 복사후 삭제
# cp -a /boot/grub /tmp
# rm /tmp/grub -rf
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda8 289M 8.1M 266M 3% /tmp
2) /tmp 파티션을 unrm 명령으로 덤프를 뜹니다.
unrm - disk data recovery
# ./bin/unrm /dev/hda8 > tmp_dump
# ll -h tmp_dump
-rw-r--r-- 1 root root 281M 1월 16 19:13 tmp_dump
3) lazarus 명령으로 덤프를 뜬 파티션의 파일을 복구합니다.
lazarus =create structure from unstructured data
# ./bin/lazarus -h tmp_dump --> 아래와 같은 파일과 디렉토리 생성
# ll -h
drwx------ 2 root root 106496 1월 16 19:48 blocks
-rw-r--r-- 1 root root 294216704 1월 16 19:13 tmp_dump
-rw-r--r-- 1 root root 203 1월 16 19:14 tmp_dump.frame.html
-rw-r--r-- 1 root root 730609 1월 16 19:48 tmp_dump.html
-rw-r--r-- 1 root root 1472 1월 16 19:14 tmp_dump.menu.html
drwx------ 2 root root 270336 1월 16 19:48 www
4) blocks 디렉토리에서 /boot/grub/grub.conf 파일의 내용과 동일한 파일을 검색합니다. 여기에서는 LABEL이라는 단어로 검색하였습니다.
# grep LABEL ./blocks/*.txt
Binary file ./blocks/7631.t.txt matches
7631.t.txt 라는 파일을 열어보니 /boot/grub/grub.conf 파일 내용과 일치함을 보였습니다. 복구에 성공!!
# cat ./blocks/7631.t.txt
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda7
# initrd /initrd-version.img
#boot=/dev/hda
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-46.9.legacy)
root (hd0,0)
kernel /vmlinuz-2.4.20-46.9.legacy ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-46.9.legacy.img
title Red Hat Linux (2.4.29)
root (hd0,0)
kernel /vmlinuz-2.4.29 ro root=/dev/hda7 hdc=ide-scsi
initrd /initrd-2.4.29.img
title Red Hat Linux (2.4.20-37.9.legacy)
root (hd0,0)
kernel /vmlinuz-2.4.20-37.9.legacy ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-37.9.legacy.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-8.img
# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda7
# initrd /initrd-version.img
#boot=/dev/hda
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-46.9.legacy)
root (hd0,0)
kernel /vmlinuz-2.4.20-46.9.legacy ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-46.9.legacy.img
title Red Hat Linux (2.4.29)
root (hd0,0)
kernel /vmlinuz-2.4.29 ro root=/dev/hda7 hdc=ide-scsi
initrd /initrd-2.4.29.img
title Red Hat Linux (2.4.20-37.9.legacy)
root (hd0,0)
kernel /vmlinuz-2.4.20-37.9.legacy ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-37.9.legacy.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.20-8.img
3. 참고 문서
출처 : http://kltp.kldp.org/stories.php?story=01/11/01/7561951
---------------------------------------------------------------------------------------------------------------
며칠 전에 약 1주일이 넘도록 힘들게 만들어 놓은 작업 데이타를 어쩌다가(지운 과정도 상당히 복잡하지만 생략) 결국 "rm -rf"로 지워 버리고 말았습니다. 결국 이틀이 걸려 제가 찾으려던 텍스트 화일 두개(크기는 각각 약 8KB, 97KB)를 복구하였습니다. 제가 한 과정을 요약해서 올립니다. (제 피씨는 wow 7.1 파란입니다.)
"적수네 동네"와 kldp.org에서 "rm -rf"로 지운 화일을 복구하는 데에 대해서 검색을 해 봤는데 우선 적수네 동네 질답게시판에서 tct라는 프로그램으로 복구할 수 있다는 말이 있었습니다. 그리고 kldp.org에서는 화일복구에 대한 mini-howto가 있었는데 저는 mini-howto를 쫓아 하다가 거기에 나오는 툴들이 시스템에 안 깔려 있길래 그냥 tct를 사용해서 복구를 했습니다.
tct는 http://www.fish.com/tct 에서 다운받을 수 있습니다. 프로그램의 설명서는 http://www.fish.com/tct/help-recovering-file 이 화일입니다.
제 경우는 홈디렉토리를 지웠습니다. 설명서에 보면 지운 화일이 속한 파티션에 더이상의 쓰기는 하지 말고 umount를 하라고 되어 있습니다. 저의 경우는 홈디렉토리가 루트디렉토리(/)에 있어서 umount를 하지는 못했고, 마침 안 쓰고 있던 파티션이 있었는데 거기에서 지금부터 하는 작업 모두를 해서 화일이 삭제된 파티션을 더이상 쓰지 않았습니다.
tct를 사용하려면 화일이 지워진 파티션의 빈 공간(저의 경우 2.5GB)보다 2.2배 정도의 빈 공간이 다른 파티션에 필요합니다. 저는 마침 6.7GB의 빈 공간이 되는 파티션이 있었는데, 정말 tct로 작업을 다 하니 6.7GB가 정말 다 차 버렸습니다.
이제 복구를 하는데 물론 root로 합니다. tct를 받아서 빈 파티션에 풀고 컴파일했습니다. (./configure를 하고 make all 만 하고 make install은 안 했습니다.) 복구는 두 단계로 나뉩니다. 작업은 tct를 압축풀은 바로 그 디렉토리에서 합니다.
1. 먼저 unrm으로 해당 파티션의 빈 공간을 하나의 커다란 화일로 덤프합니다.
$ bin/unrm /dev/hda7 > dump
2. 그 다음 lazarus로 덤프된 큰 화일을 지워지기 전엔 하나의 화일이었다 생각되는데로 화일단위로 쪼갭니다. (설명서에 보면 시간이 많이 걸린다고 되어 있는데 이 작업이 저의 경우 약 24시간은 걸린 것 같습니다.)
$ bin/lazarus -h dump
lazarus를 백그라운드로 돌려 놓고 보면 blocks라는 디렉토리와 www라는 디렉토리가 생기고 html 화일들이 세 개 생깁니다. 실제 blocks라는 화일에 덤프화일이 조각조각 쪼개져 저장이 됩니다. 운이 좋으면 초기에 쪼개져 나온 화일들 중에서 grep으로 잃어 버린 화일을 찾을 수도 있습니다.
예를 들어 지운 화일에 아주 특이한 단어가 들어 있다면(예를 들어 자기 이름) 그것으로 grep 하면 금방 찾을 수가 있습니다. 저의 경우는 운이 없었는지 해당 화일이 하드디스크 뒷부분에 있었는지 24시간이 다 지난 다음에야 찾을 수 있었습니다.
참고로 dump화일이 2GB가 넘으면 리눅스 커널과 펄(lazarus가 사용함)이 모두 2GB를 지원해야 lazarus가 실행이 됩니다. 제 덤프화일은 3.5GB여서 역시 처리를 못했는데 펄을 다시 최신 소스를 받아다 설치를 하니(물론 지워진 파티션에 설치하면 안 됨) lazarus가 그제서야 실행이 되었습니다(lazarus화일을 열어 첫 줄의 perl 위치를 바꿔줘야 함).
그리고 blocks안의 화일이 너무 많으면 grep도 화일이 너무 많다고 해서 동작을 못하는데(저의 경우도 역시 이랬습니다.) 이럴 때는
$ grep 문자열 1????.txt
$ grep 문자열 2????.txt
$ grep 문자열 3????.txt
...
이런 식으로 나누어서 grep 해주면 됩니다.
사실 시간이 총 이틀 정도 걸렸는데(백그라운드로 돌려 놓고 대부분 다른 일을 하긴 했지만) 이 방법이 아니라, inode 관련한 mini-howto 방법은 더 빠를지 저도 잘 모르겠구요. 시간이 좀 걸리더라도 중요한 화일을 꼭 복구해야 하는 분은 한번 시도해 보세요. 물론 덤프된 화일 사이즈가 작다면 시간은 그렇게까지 많이 걸리지는 않을 것입니다.