source

Linux의 C 프로그램에서 FS가 없는 하드 디스크에 직접 액세스

ittop 2023. 10. 9. 23:31
반응형

Linux의 C 프로그램에서 FS가 없는 하드 디스크에 직접 액세스

나는 C 프로그램에서 하드디스크 전체를 직접 접속하고 싶습니다.FS는 없고 FS는 절대 없을 겁니다

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

저는 리눅스 환경(C언어, 파이썬, 펄, 자바를 알고 있습니다)에서 C 프로그래밍을 배우기 위한 프로그램을 작성할 계획이지만 리눅스 환경에 대한 자신감이 부족합니다.

학습 목적으로 교토 캐비닛을 가지고 놀고 계산된 해시에 해당하는 값을 하드 디스크의 "블록/섹터"에 직접 저장하여 쌍을 기록하려고 합니다.교토-hash 해시 데이터베이스 파일에 "cabinet, 블록/섹터 참조".

표준 CI/O 기능을 사용하여 이것이 가능한지 아니면 "디바이스 드라이버" 같은 것을 써야 하는지 모르겠습니다.

다른 곳에서 언급된 바와 같이 *NIX 시스템에서는 다음과 같은 장치를 차단합니다./dev/sda일반 파일로 접근할 수 있습니다.장치에서 파일 시스템이 마운트된 경우 파일 시스템을 쓰기 위한 파일로 열지 못합니다.

블록 장치를 가지고 놀고 싶다면 먼저 평 파일을 블록 장치로 제공하는 를 사용하는 것이 좋습니다.예를 들어,

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

그 다음에./dev/loop0블록 장치인 것처럼 행동하지만 작성된 모든 정보는 파일에 저장됩니다.

드라이브에 대한 장치 파일(예:/dev/sda)는 블록 장치로, 일반 파일처럼 파일을 열고 검색하고 사용할 수 있습니다.

네, 다른 분들이 지적하신 것처럼 블록 장치를 간단하게 열 수 있습니다.

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

사용할 수 있는 ioctl이 많이 있습니다. 자세한 내용은 "mansd"를 참조하십시오.그것들이 모두 같은 장소에 기록되어 있는 것 같지는 않습니다.

linux/fs.h BLKROSET 및 여러 ioctl이 정의되어 있으므로 사용 방법을 알아보기 위해 주위를 둘러봐야 합니다.장치의 크기와 블록 크기를 파악하는 등 유용한 작업을 수행할 수 있습니다.

util-linux-ng 패키지의 소스 코드는 당신의 친구이며, 예를 포함하고 있습니다.

언급URL : https://stackoverflow.com/questions/3520459/direct-access-to-hard-disk-with-no-fs-from-c-program-on-linux

반응형