2014-11-19 2 views
0

C 언어를 사용하여 ext2 이미지 내에서 특정 inode (번호 사용)에 싶습니다. open() 시스템 콜에서 ext2 이미지를 열고, inode에 도달 할 때까지 lseek()를 올바른 오프셋으로 사용하여 트래버스합니다. 이 올바른지? 아니면 내가 잘못하고있는거야? 나는 open()을 사용하는 것이 옳은가, 아니면 이것을하기 위해 더 적절한 함수가 있는지 조금 혼란 스럽다. 나는 아이 노드에 도달 할 때까지특정 inode를 ext2 이미지로 가져 오기 (C)

int fd = open("ext2fs.img", O_RDONLY); 
assert(fd != -1); 


off_t startPosition = lseek(fd, 0, SEEK_CUR); 
assert(startPosition != -1); 

난 그냥 startPosition입니다에 오프셋을 추가해야 하는가? 하지만 특정 inode를 검색하려면 어떻게해야합니까? 업데이트]

내가 이미 ext2 파일 시스템 (http://www.nongnu.org/ext2-doc/ext2.html)의 레이아웃을

(구체적으로)이 나에게 내가 필요로하는 중요한 모든 (모든 오프셋)를 제공합니다. 그리고 메타 데이터와 데이터를 조작하기위한 C 프로그램을 만들어야합니다. 파일을 제거하고 복사하는 것과 같습니다.

나는 무엇을해야할지 알고 있지만, 구현하는 데 문제가 있습니다.

예를 들어 :

#define SUPER_BLOCK 1024 

int main() 
{ 
    int freeInodes; 

    int fd = open("path.img", O_RDONLY); 
    off_t startPosition = lseek(fd, 0, SEEK_CUR); 

    lseek(fd, startPosition + SUPER_BLOCK + 16, SEEK_CUR); 
    read(fd, freeInodes, 4); 
    printf("Number of free inodes: %d", freeInodes); 
} 

출력 : 내가 뭘하는지 알고 있다면 테스트하려면, 내가이 일을 내 교수가 제공 한 EXT2 디스크 이미지 무료 아이 노드의 수를 읽으려고 해요 수신 : "무료 inode 수 : 32767"

내가 read()에서 얻은 데이터를 올바르게 해석합니까? 나는이 값이 정확한지 잘 모른다.

답변

1

파일 시스템 보안을 우회하는 것을 제외하고는 inode로 액세스하는 실제 사용 사례가 없습니다. Linux에서는 debugfs을 사용하여이를 수행 할 수 있습니다. 절대적인 요구 사항이라고 생각한다면 debugfs 소스 코드를 사용해보십시오.

파일 트리 워크 (ftw()/nftw())의 stat() 호출을 콜백으로 사용하거나 빠른 코딩을 위해 stat() + scandir()을 직접 사용하는 것이 좋습니다. 둘 중 하나를 사용하면 stat에 대한 권한이있는 파일의 모든 inode를 가져올 수 있습니다. 그리고 무엇이든 열리거나.

1

fsck.ext{2,3,4}에서 수행되는 것과 비슷한 파일 시스템 이미지에서 원시 읽기를 시도 할 수 있습니다. 그러나 이것은 ext {2,3,4} 레이아웃에 대한 광범위한 지식, 디스크상의 구조 및 (비트 맵/기타 메타 데이터를 가리키는 디스크의 오프셋) 매직 넘버의 이해를 필요로하여 inode 비트 맵 디스크에서 시작하십시오.

+0

그게 정확히 내가하려는거야! 나는 이미 ext2 파일 시스템 (http://www.nongnu.org/ext2-doc/ext2.html)의 레이아웃을 가지고있다. 이것은 내가 필요한 모든 것을 (모든 오프셋) 제공한다. 그리고 메타 데이터와 데이터를 조작하기위한 C 프로그램을 만들어야합니다. 나는 무엇을해야할지 이미 알고 있지만 구현하는 데 문제가 있습니다. 원래 게시물을 업데이트 할 것입니다. –