Skip to content

리눅스에서 실수로 삭제한 파일을 복구

조회 수 23594 추천 수 0 2008.12.10 22:02:46

리눅스에서 실수로 삭제한 파일을 복구하는 방법입니다.

한 가지 중요한 사항으로 삭제된 파일을 복구하기 위한 전제 조건은
삭제하였던 파일이 있었던 하드디스크의 섹터 부분이 다른 파일로
덮어 씌워지기 전에 복구해야 된다는 것입니다.


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 방법은 더 빠를지 저도 잘 모르겠구요. 시간이 좀 걸리더라도 중요한 화일을 꼭 복구해야 하는 분은 한번 시도해 보세요. 물론 덤프된 화일 사이즈가 작다면 시간은 그렇게까지 많이 걸리지는 않을 것입니다.

profile

일요일은 짜빠게뤼~ 먹는날~^^

엮인글 :
http://adminplay.com/1036/f30/trackback
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
267 time.bora.net 시간 동기화후 dovecot 데몬이 죽는 현상 해결 ADMINPLAY 2009-04-27 23894
266 [Linux] too many files 에러가 날때 ADMINPLAY 2009-09-20 23833
265 DRBD(Distributed Replicated Block Device) 에 대해서 ADMINPLAY 2012-01-16 23737
264 [Linux]RedHat Enterprise Linux 5 계열 VNC Server 설정 ADMINPLAY 2009-09-25 23712
» 리눅스에서 실수로 삭제한 파일을 복구 ADMIN 2008-12-10 23594
262 kernel: nf_conntrack: table full, dropping packet. ADMINPLAY 2009-11-26 23587
261 리눅스 로그파일 관리 [로그파일 삭제하는 방법] ADMINPLAY 2009-07-31 23532
260 리눅스 쓸데없는 파일,로그파일 주기적으로 삭제하기 ADMINPLAY 2009-07-02 23524
259 libphp4.so: cannot restore segment prot after reloc: P... ADMINPLAY 2011-02-07 23518
258 리눅스에서 베드섹터 검사명령어 ADMINPLAY 2009-08-18 23513
257 포트 포워딩 도구 ipmasqadm file ADMINPLAY 2009-09-08 23496
256 vi 이용한 파일내용 일괄변경 ADMINPLAY 2010-08-10 23491
255 eAccelerator설치와 PHP 성능 향상 분석 ADMINPLAY 2011-06-22 23472
254 서버 점검 : 자원 및 apache, mysql ADMIN 2008-12-10 23466
253 LVS 기능 및 장점과 설치프로그램 및 적용사이트 ADMINPLAY 2009-11-04 23389
252 Linux 파일 오픈 갯수 확인 ADMINPLAY 2009-05-10 23386
251 X-window 설치 ADMINPLAY 2010-03-24 23361
250 single mode readonly 파티션 rw로 다시 마운트 ADMINPLAY 2008-12-10 23302
249 인터넷 속도 단위 (bps, cps) ADMINPLAY 2009-08-03 23301
248 FreeBSD SSH 접속 안되요 ADMINPLAY 2009-07-14 23279

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234