Linux: Accès direct au disque dur (sans aucun FS) à partir du programme C

Je veux accéder à l’ensemble du disque dur directement à partir d’un programme C. Il n’y a pas de FS sur lui et ne le sera jamais.

Je veux juste ouvrir / dev / sda (par exemple) et faire des E / S au niveau du bloc / secteur du disque.

Je prévois d’écrire des programmes pour apprendre la programmation en C dans l’environnement Linux (je connais le langage C, Python, Perl et Java) mais je ne fais pas confiance à l’environnement Linux.

Pour mon apprentissage, je pense à jouer avec kyoto-cabinet et à enregistrer la valeur correspondant au hachage calculé directement dans un “bloc / secteur” du disque dur, en enregistrant la paire: “hash, block / sector reference” dans un Fichier de firebase database de hachage kyoto-cabinet.

Je ne sais pas si cela est faisable en utilisant les fonctions standard de CI / O ou sinon je devrais écrire un “pilote de périphérique” ou quelque chose comme …

Comme mentionné ailleurs, sous les systèmes * NIX, les périphériques de bloc tels que /dev/sda sont accessibles en tant que fichiers simples. Notez que si le système de fichiers est monté à partir du périphérique, son ouverture en tant que fichier pour écriture échouerait.

Si vous voulez jouer avec des périphériques en mode bloc, je vous conseille d’utiliser d’abord le loop device , qui présente un fichier simple en tant que périphérique en mode bloc. Par exemple:

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

Après cela, /dev/loop0 se comporterait comme si c’était un périphérique de bloc, mais toutes les informations écrites seraient stockées dans le fichier.

Comme les fichiers de périphériques pour les lecteurs (par exemple, /dev/sda ) sont des périphériques en mode bloc, cela signifie que vous pouvez ouvrir, rechercher et utiliser le fichier presque comme un fichier normal.

Oui, comme d’autres l’ont noté, vous pouvez simplement ouvrir le périphérique de bloc.

Cependant, c’est vraiment une bonne idée de faire IO (écrit quand même) sur les limites de blocs et les blocs entiers. Vous pouvez utiliser quelque chose comme pread () et pwrite () pour effectuer ces E / S ou pour mapper tout ou partie du périphérique.

Il y a un tas d’ioctls qui peuvent être utilisés, voir “man sd” pour plus d’informations. Ils ne semblent pas tous être documentés au même endroit.

Dans linux / fs.h, BLKROSET et un tas d’autres ioctls sont définis, vous devez regarder autour de vous pour savoir comment les utiliser. Vous pouvez faire des choses utiles comme déterminer la taille de l’appareil et sa taille.

Le code source du paquet util-linux-ng est votre ami, il contient des exemples.