2009-11-04 2 views
3

블록 레벨에서 ext3 파일 시스템에 액세스하는 가장 쉬운 방법은 무엇입니까? 파일이나 원시 바이트를 신경 쓰지 않고 한 번에 FS 블록 하나만 읽어야합니다. C에서이 작업을 수행하는 간단한 방법이 있습니까? 아니면 내가 소스에서 영감을 조사 할 수있는 간단한 앱일까요? 사용 가능한 튜토리얼을 그물에서 발견하지 못했고, 커널 소스를 어떻게 사용하는지 알아보기가 무서워요.ext3 파일 시스템에서 블록을 읽으시겠습니까?

+1

dd와 같은 기능을 제공합니다. 지금까지 내가 오프셋과 길이 등을 정의 할 수 있다는 것을 기억한다. – Bobby

답변

2

예, e2fsprogs을 참조하십시오. 이것은 ext2, ext3 및 ext4 파일 시스템으로 무엇이든 할 수있는 도구 (!)를 제공합니다. 또한 라이브러리 인터페이스가 포함되어 있으므로 다른 작업을 수행 할 수 있습니다.

포함 된 debugfs를 참조하십시오. 시작하는 것으로 충분할 수 있습니다. 그렇지 않으면 헤더를 체크 아웃하고 코드를 작성하십시오. 그 안에

1

디스크 장치, 파티션, 그냥 당신은 물론 루트해야 당신이 읽고 (및 쓰기) 할 수 있습니다 일반 파일, 예컨대 :

head -c 2048 /dev/sda1 > first_2048_bytes 

처럼 행동.

+1

보통'dd'에 우선적으로 접근한다. 리눅스는 신경 쓰지 않지만, 전통적으로 블록 I/O 만 허용한다. – ephemient

+0

ephemient에 동의하면 dd가 더 나은 도구입니다. –

+0

동의 함, 그냥 디스크 장치가 일반 파일처럼 취급 될 수 있다는 것을 지적하는 것이 도움이 될 것이라고 생각했습니다. (이것은 DOS에서 몇 년 전에 나온 것입니다 ...) –

4

간단한 응용 프로그램을 원한다면 "dd"유틸리티를 살펴보십시오. 나는 GNU Core Utility의 일부로 제공됩니다. 소스를 다운로드 할 수 있습니다. 홈페이지 (here)를보십시오.
C 코드에서 동일하게하려면 다음 코드를 참조하십시오. 희망이 당신을 도와줍니다. :)

#include <stdio.h> 
#include <linux/fs.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

#define SECTOR_NO 10 /*read 10th sector*/ 

int main() 
{ 
     int sector_size; 
     char *buf; 
     int n = SECTOR_NO; 

     int fd = open("/dev/sda1", O_RDONLY|O_NONBLOCK); 
     ioctl(fd, BLKSSZGET, &sector_size); 
     printf("%d\n", sector_size); 
     lseek(fd, n*sector_size, SEEK_SET); 

     buf = malloc(sector_size); 
     read(fd, buf, sector_size); 

     return 0; 
} 
+0

왜 O_NONBLOCK입니까? 특수 장치 (예 : 모뎀)를 열지 않는 한, 바쁘거나 실재로 도전을받는 것을 차단하기 위해 열어 놓을 수 있습니까? –

+0

또한 커널의 bdev_logical_block_size() (실제로 ioctl 핸들러에서 반환하여 예제에서 sector_size를 설정 함)는 부호없는 short를 반환합니다. –

+0

@tinkertim 네, 맞습니다! –

관련 문제