2010-08-19 19 views
16

Je veux accéder à tout le disque dur directement à partir d'un programme C. Il n'y a pas de FS dessus et ça ne le sera jamais. Je veux juste ouvrir/dev/sda (par exemple) et faire des E/S au niveau du bloc/secteur du disque. J'ai l'intention d'écrire quelques programmes pour apprendre la programmation C dans l'environnement Linux (je connais le langage C, Python, Perl et Java) mais manque de confiance dans l'environnement Linux. Pour mes besoins d'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 référence "dans un fichier de base de données de hachage kyoto-cabinet.Linux: Accès direct au disque dur (sans FS) depuis le programme C

Je ne sais pas si cela est possible en utilisant des fonctions de CI/S standard ou sinon je dois écrire un « pilote de périphérique » ou quelque chose comme ...

Répondre

7

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

18

Comme mentionné précédemment, sous les systèmes * NIX, les périphériques de bloc comme /dev/sda sont accessibles en tant que fichiers simples. Notez que si le système de fichiers est monté à partir du périphérique, l'ouvrir en tant que fichier pour l'écriture échouerait.

Si vous voulez jouer avec des périphériques de bloc, je vous conseille d'utiliser d'abord le loop device, qui présente un fichier uni en tant que périphérique 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 ADOPTERAIENT comme si elle était un dispositif de bloc, mais toutes les informations écrites seraient stockées dans le fichier.

+0

Merci à tous pour la réponse rapide. Je vais d'abord essayer avec des appareils à boucle. –

+3

+1 également pour l'utilisation de périphériques de boucle à tester. – MarkR

5

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

Cependant, c'est une très bonne idée de faire des E/S (écrit quand même) sur des limites de blocs et des blocs entiers. Vous pouvez utiliser quelque chose comme pread() et pwrite() pour faire ces IO, ou mmap tout ou partie de l'appareil.

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 pour savoir comment les utiliser. Vous pouvez faire des choses utiles, par exemple découvrir la taille du périphérique et la taille du bloc.

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

+0

Merci beaucoup @MarkR. Je vais prendre cela en considération, mais comme presque un débutant dans la programmation Linux, peut-être trop difficile à démarrer avec ... –

+0

Linux programmation est presque exactement comme la programmation Windows, donc ça ne devrait pas être un problème ... vous regardez un API, écrivez un programme de test pour l'essayer, puis utilisez-le dans votre application. Juste comme Windows. – MarkR