Question

Je voudrais écrire un pilote de périphérique bloc linux. Le conducteur aurait pas besoin d'accéder au matériel de sorte qu'il peut être dans l'espace utilisateur.

Pour commencer, j'ai essayé de construire un pilote de périphérique bloc exemple avec ce Makefile:

obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

Je reçois cependant ces erreurs que je ne sais pas comment résoudre. Voici le stdout et stderr:

make -C /lib/modules/2.6.31-19-generic/build M=/home/andreas/sp/nivoa/src/driver/sbd modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.31-19-generic'
  CC [M]  /home/andreas/sp/nivoa/src/driver/sbd/sbd.o
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:72: error: expected ‘)’ before ‘*’ token
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:128: warning: initialization from incompatible pointer type
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c: In function ‘sbd_init’:
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: ‘sbd_request’ undeclared (first use in this function)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: (Each undeclared identifier is reported only once
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: for each function it appears in.)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:146: error: implicit declaration of function ‘blk_queue_hardsect_size’
make[2]: *** [/home/andreas/sp/nivoa/src/driver/sbd/sbd.o] Error 1
make[1]: *** [_module_/home/andreas/sp/nivoa/src/driver/sbd] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.31-19-generic'
make: *** [all] Error 2

Toute aide sur ce serait grandement apprécié.

Merci, Andreas

Était-ce utile?

La solution

Il n'y a pas les pilotes façon de faire bloc « officiel » dans l'espace utilisateur, mais les gens font souvent par (ab) en utilisant le pilote NBD pour parler sur un réseau de rebouclage à un démon qui écoute sur une prise normale et parle la protocole NBD. Voir la documentation NBD pour plus d'informations.

Votre exemple est un dispositif de blocage en mode noyau, qui devra être construit comme un module du noyau. Et comme les entrailles du noyau changent toujours, il est sans doute aujourd'hui incompatible.

Autres conseils

Suite à la suggestion de MarkR, il est même possible de parler du protocole NBD sur une paire de prise AF_UNIX, donc pas de démon local supplémentaire est nécessaire. Le programme mettant en oeuvre ce protocole devra mettre en place la paire de prise et bifurquer un enfant. Les deux parents et les enfants ferment une extrémité de la paire de prise. L'un d'eux commence à prendre des demandes à son extrémité de la douille tandis que l'autre se connecte le pilote NBD à son extrémité de la douille.

regarde toujours la première erreur:

Dans votre cas, il ressemble à un problème avec inclure des fichiers, par exemple request_queue_t n'est pas défini.

Comme il est un type Obsolète, vous utilisez probablement une version de linux / blkdev.h qui est plus récente que l'exemple de code.

Essayez d'ajouter typedef struct request_queue request_queue_t;

Lors de l'utilisation NBD, comme suggéré précédemment, est agréable, peut-être une meilleure façon (utilisée, par exemple, virtualbox-fusible) est de faire un système de fichiers FUSE qui exporte un fichier, que vous pouvez ensuite utiliser via losetup.

Vous pouvez utiliser NBD. En utilisant nbdkit vous pouvez même écrire des périphériques blocs virtuels dans script shell ou d'autres langages de script (bien coller à C si vous voulez la meilleure performance) . J'ai donné un discours sur ce sujet au FOSDEM 2019 où je l'ai fait une écriture de démonstration en direct un dispositif de bloc de noyau Linux dans le script shell.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top