다중 사용자, 멀티 태스킹 운영 체제인 Linux에서는 파일이 삭제되면 복구하기 어렵습니다. 삭제 명령은 삭제할 파일 노드를 표시할 뿐 실제로 파일 내용을 지우지는 않지만 디스크에 쓰는 다른 사용자와 일부 프로세스는 데이터를 빠르게 덮어씁니다.
1. Ext2 파일 시스템의 구조에 대한 간략한 소개
Linux에서 사용하는 Ext2 파일 시스템에서는 파일이 블록 단위로 저장되며, 기본적으로 각 블록의 크기는 1K이며, 블록 번호로 서로 다른 블록을 구분합니다. 각 파일에는 파일 소유자, 읽기 및 쓰기 권한, 파일 유형 및 기타 정보가 포함된 노드도 있습니다. 12개 블록보다 작은 파일의 경우 파일 데이터 블록의 블록 번호가 노드에 직접 저장됩니다. 파일이 12개 블록보다 큰 경우 노드는 12개 블록 번호 뒤에 간접 블록의 블록 번호를 저장합니다. 이 간접 블록 번호에 해당하는 블록에는 256개의 파일 데이터 블록의 블록 번호가 저장됩니다(Ext2fs의 각 블록). 번호는 4바이트를 차지하므로 하나의 블록에 저장할 수 있는 블록번호는 1024/4=256이다. 더 큰 파일이 있는 경우 보조 간접 블록과 ** 간접 블록도 노드에 나타납니다.
2. 실수로 삭제한 파일을 복구하는 방법
대부분의 Linux 배포판은 Ext2 파일 시스템을 편집하는 데 사용할 수 있는 debugfs 도구를 제공합니다. 하지만 이 도구를 사용하기 전에 수행해야 할 작업이 아직 남아 있습니다.
먼저, 실수로 삭제한 파일이 있는 파티션을 읽기 전용 모드로 다시 마운트하세요. 다음 명령을 사용하십시오: (파일이 /usr 파티션에 있다고 가정)
mount -r -n -o remount /usr -r은 읽기 전용 마운트를 나타내고, -n은 /etc/mtab에 쓰지 않음을 나타냅니다. 시스템에서 xxx 파티션이 사용 중이라고 표시되면 Fuser 명령을 사용하여 어떤 프로세스가 이 파티션의 파일을 사용하는지 확인할 수 있습니다.
퓨저 –v –m /usr
중요한 프로세스가 없으면 다음 명령을 사용하여 중지합니다.
퓨저 -k -v -m /usr
그런 다음 이러한 파일 시스템을 다시 마운트할 수 있습니다.
모든 파일이 대형 / 파티션에 설치되어 있는 경우 Linux Single을 사용하여 부팅 프롬프트에서 단일 사용자 모드로 들어가 시스템 프로세스가 하드 디스크에 데이터를 쓸 가능성을 최소화하거나 하드 디스크를 다른 위치에 걸어 놓을 수 있습니다. . 또한 유용한 데이터가 손상되지 않도록 복구된 데이터를 / 위에 쓰지 마십시오. 머신에 dos/windows가 있으면 다음 파티션에 쓸 수 있습니다.
마운트 –r –n /dev/hda1 /mnt/had
그런 다음 debugfs를 실행할 수 있습니다: (Linux가 /dev/hda5에 있다고 가정)
#debugfs /dev/hda5
debugfs 프롬프트 debugfs가 나타납니다:
삭제된 많은 파일에 대한 정보를 나열하려면 lsdel 명령을 사용하십시오.
debugfs:lsdel debugfs: 2692개의 삭제된 inode가 발견되었습니다. Inode 소유자 모드 크기 블록 시간 삭제됨 164821 0 100600 8192 1/ 1 2001년 5월 13일 일요일 19:22:46 36137 0 100644 4 1/ 1 2001년 4월 24일 화요일 10:11:15 196829 0 100644 149500 38/ 38 2001년 5월 27일 월요일 13:52:04 |
많은 파일이 나열되어 있습니다(여기서는 2692개 있음). 첫 번째 필드는 파일 노드 번호이고, 두 번째 필드는 파일 소유자이고, 세 번째 필드는 읽기 및 쓰기 권한이며, 파일 크기, 점유된 블록 수, 삭제 시간.
그런 다음 파일 크기와 삭제 날짜를 기준으로 필요한 항목을 결정할 수 있습니다. 예를 들어 노드 196829를 사용하여 파일을 복원하려고 합니다.
먼저 파일 데이터 상태를 확인할 수 있습니다.
debugfs:stat <196829> Inode: 196829 유형: 일반 모드: 0644 플래그: 0x0 버전: 1 사용자: 0 그룹: 0 크기: 149500 파일 ACL: 0 디렉터리 ACL: 0 링크: 0 블록수: 38 조각: 주소: 0 번호: 0 크기: 0 ctime: 0x31a9a574 -- 2001년 5월 27일 월요일 13:52:04 atime: 0x31a21dd1 -- 2001년 5월 21일 화요일 20:47:29 mtime: 0x313bf4d7 -- 2001년 3월 5일 화요일 08:01:27 dtime: 0x31a9a574 -- 2001년 5월 27일 월요일 13:52:04 블록: 594810 594811 594814 594815 594816 594817 합계: 38 |
그런 다음 dump 명령을 사용하여 파일을 복원할 수 있습니다.
debugfs: 덤프 <196829> /mnt/hda/01.sav
그러면 파일이 복원됩니다. debugfs를 종료합니다:
debugfs:종료
또 다른 방법은 inode를 수동으로 편집하는 것입니다.
debugfs:mi <196829> 모드 [0100644] 사용자ID [0] 그룹ID [0] 사이즈[149500] 생성 시간 [0x31a9a574] 수정 시간 [0x31a9a574] 액세스 시간 [0x31a21dd1] 삭제시간 [0x31a9a574] 0 링크 수 [0] 1 블록 수 [38] 파일 플래그 [0x0] 예약됨1[0] 파일 ACL [0] 디렉토리 ACL [0] 조각 주소 [0] 조각 번호 [0] 조각 크기 [0] 직접 블록 #0 [594810] 삼중간접블록 [0] |
mi 명령을 사용한 후 한 번에 한 줄의 정보가 편집용으로 표시됩니다. 다른 줄의 경우 직접 Enter를 눌러 확인하고 삭제 시간을 0(삭제되지 않음)으로 변경하고 링크 수를 1로 변경할 수 있습니다. 변경한 후 debugfs를 종료합니다.
debugfs:종료
그런 다음 fsck로 /dev/hda5를 확인하세요.
fsck /dev/hda5
프로그램은 손실된 데이터 블록을 찾았다고 말하고 이를 Lost+found 상태로 둡니다. 이 디렉토리의 파일은 우리가 원하는 것입니다.