읽을 수 있는 형태로 덤프된 inode를 보자.
# xxd debugfs-dump | less |
모든 엔트리는 다섯개의 필드로 구성된다. 첫 두 필드는 역순으로 바이트가 배열되어있다. 이는 첫번째 바이트가 제일 낮은 자리의 수라는 것을 의미한다.
각 필드의 설명.
4 바이트 - Inode 번호.
2 바이트 - 디렉토리 엔트리 길이.
1 바이트 - 파일이름 길이 (1-255).
1 바이트 - 파일의 종류.
0 = 알수없음
1 = 일반 파일
2 = 디렉토리
3 = 문자 디바이스
4 = 블럭 디바이스
5 = FIFO
6 = SOCK
7 = 심볼릭 링크
파일이름 (1-255자).
만약 디렉토리의 어떤 엔트리가 지워져야 한다면, 지워져야 할 엔트리 바로 앞에 있는 엔트리의 두번째 필드가 지워져야 할 엔트리의 두번째 필드 값만큼 증가된다.
만약, 파일이름이 더 짧은 것으로 바뀌면, 세 번째 필드값이 줄어든다.
맨 첫 엔트리는 '.'으로 표현되는 그 디렉토리 자신이다.
우리가 다음과 같은 디렉토리 엔트리들을 가지고 있다고 하자.
c1 02 0e 00 40 00 05 01 'u' 't' 'i' 'l' 's' |
그러면 inode는 16진수로 e02c1이 될 것이고, 이는 10진수로 918209이다. 다음 엔트리는 64바이트(16진수로 40) 뒤에 위치하게 될 것이고, 우리는 파일 이름이 5자("utils")로 구성된 것을 알 수 있다. 그리고 파일의 종류는 일반 파일임을 알 수 있다.
이제 디렉토리의 inode 번호를 10진수로 다시 계산하자.
만약 이를 손으로 계산하고 싶지 않다면, 내가 C로 만든 작은 프로그램을 사용해라. 이 프로그램은 디렉토리 덤프( 4절에서 설명된 debugfs 으로 만들어진다 )를 입력으로 받고, 각 엔트리의 inode번호와 파일이름을 stdout에 출력한다.
프로그램을 실행시키기 전에, 덤프를 hex에디터로 불러들여 되살리고자 하는 디렉토리 엔트리 바로 앞 엔트리의 디렉토리 엔트리 길이필드를 조정할 필요가 있다. 그러나, 이는 간단하다. 만약 앞쪽 엔트리의 필드 값을 x라 하고, 되살리고자 하는 엔트리의 필드 값을 y라 하면, x를 x - y로 바꾸면 된다.
http://www.matematik.su.se/~tomase/ext2fs-undeletion/ 에서 e2dirana (ext2fs directory analyse)란 프로그램을 구할 수 있다.