2010-08-19 2 views
16

C 프로그램에서 직접 전체 하드 디스크에 액세스하려고합니다. 거기에 FS가없고 결코 될 수 없어.리눅스 : C 프로그램의 하드 디스크 직접 액세스 (FS없이)

디스크의 블록/섹터 수준에서/dev/sda (예 :)를 열어 I/O를 수행하고 싶습니다.

리눅스 환경에서 C 프로그래밍을 배우기위한 몇 가지 프로그램을 작성하려고합니다 (C 언어, Python, Perl 및 Java를 알고 있습니다). 그러나 Linux 환경에 대한 확신이 없습니다.

내 학습 목적을 위해 나는 kyoto 캐비닛을 가지고 계산 된 해시에 해당하는 값을 하드 디스크의 "블록/섹터"에 직접 저장하여 페어를 기록합니다. "해시, 블록/섹터 reference "를 kyoto-cabinet 해시 데이터베이스 파일에 저장합니다.

이 표준 CI/O 기능을 사용 가능 또는 그렇지 않으면 나는 "장치 드라이버"또는 같은 뭔가를 작성해야 더라면 나도 몰라

... 드라이브 장치 파일로

답변

7

(예 : /dev/sda)는 블록 장치이므로 파일을 열어서 탐색하고 일반 파일과 거의 같은 방식으로 사용할 수 있습니다.

18

* NIX 시스템에서 설명한 것처럼 /dev/sda과 같은 블록 장치는 일반 파일로 액세스 할 수 있습니다. 파일 시스템이 장치에서 마운트 된 경우 쓰기 용 파일로 열면 실패합니다.

블록 장치로 재생하려면 먼저 블록 장치로 일반 파일을 제공하는 loop device을 사용하는 것이 좋습니다. 예를 들어 :이 블록 장치 인 것처럼 그 후

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K 
losetup /dev/loop0 $PWD/loop_file_10MB 

, /dev/loop0는 행동 것이지만, 기록 된 모든 정보는 파일에 저장됩니다.

+0

빠른 답변 감사드립니다. 먼저 루프 장치로 시도해 보겠습니다. –

+3

+1 또한 루프 장치를 사용하여 테스트합니다. – MarkR

5

예, 다른 사람들이 지적했듯이 블록 장치를 열면됩니다.

그러나 블록 경계와 전체 블록에서 IO (어쨌든 쓰기)를 수행하는 것이 좋습니다. pread() 및 pwrite()와 같은 것을 사용하여 이러한 IO를 수행하거나 일부 또는 전체 장치를 mmap 할 수 있습니다.

사용할 수있는 ioctls 묶음이 있습니다. 자세한 내용은 "man sd"를 참조하십시오. 그들은 모두 같은 곳에서 문서화 된 것처럼 보이지 않습니다.

linux/fs.h에서는 BLKROSET과 다른 ioctls가 정의되어 있으므로이를 사용하는 방법을 찾아야합니다. 당신은 장치가 얼마나 큰 지, 그리고 블록 크기가 무엇인지 등의 유용한 것들을 할 수 있습니다.

util-linux-ng 패키지의 소스 코드는 친구이며, 예제가 들어 있습니다.

+0

많은 감사 @MarkR. 이 점을 고려해 보겠다.하지만 리눅스 프로그래밍에있어 초보자로서 시작하기에는 너무 어려울 수도있다 ... –

+0

리눅스 프로그래밍은 윈도우 프로그래밍과 거의 비슷하므로 문제가되어서는 안된다. API, 테스트 프로그램을 작성하여 사용해보십시오. 그런 다음 앱에서 사용하십시오. Windows와 같습니다. – MarkR

관련 문제