La partie espace utilisateur du mappeur de périphériques est facultative pour que les développeurs puissent implémenter leurs propres outils de gestion de stockage. En fait, bon nombre de nos gestionnaires de volumes logiques courants, tels que LVM2, dmraid et d'autres outils, utilisent le mappeur de périphériques. La bibliothèque d'espace utilisateur établit un ensemble indépendant d'outils de gestion en fonction de ses propres besoins de gestion, mais n'utilise pas l'outil dmsetup qu'elle fournit. Même le système de gestion de volumes logiques au niveau de l'entreprise du projet open source d'IBM-EVMS n'est pas inclus dans l'implémentation. bibliothèque d'espace utilisateur du mappeur de périphériques, un ensemble de sa propre bibliothèque de fonctions est entièrement implémenté sur la base de la définition ioctl dans le noyau.
Pilote cible
Le mappeur de périphérique fournit une architecture unifiée, permettant aux utilisateurs de spécifier leurs propres règles de traitement des E/S en fonction des besoins réels via le plug-in du pilote cible, de sorte que le pilote cible incarne pleinement le périphérique. flexibilité du mappeur. Dans ce qui précède, nous avons mentionné le pilote cible plus d'une fois et décrit les fonctions du pilote cible. Nous présenterons ici en détail la mise en œuvre du pilote cible avec le pilote cible linéaire le plus simple.
Le pilote cible définit principalement les règles de traitement des requêtes IO. Dans le mappeur de périphériques, une interface unifiée a été définie pour le fonctionnement du pilote cible. Dans l'implémentation, l'interface est définie par la structure target_type que nous avons mentionnée. ci-dessus, qui définit les méthodes de pilote cible suivantes :
1. Méthode de création du périphérique cible ;
2. Méthode de suppression du périphérique cible ; Méthode de requête ;
4. Méthode de la cible pour mettre fin à la requête IO ;
5. Méthode de suspension de la lecture et de l'écriture de l'appareil cible
6. . ;
7. Accédez à l'état actuel de l'appareil cible ;
8. Mais généralement, au moins les trois premières méthodes doivent être implémentées, sinon cela ne fonctionnera pas correctement sous le mappeur de périphérique. Le pilote cible linéaire implémente uniquement les trois premières méthodes et la méthode 7. Il complète le mappage linéaire de l'espace d'adressage logique à l'espace d'adressage physique et peut former un périphérique logique en connectant linéairement plusieurs périphériques physiques, comme décrit dans la figure 4. Comme dans , les trois espaces continus de /dev/sda, /dev/sdb et /dev/sdc sont formés en un grand périphérique de bloc logique via le pilote cible linéaire. La mise en œuvre de la cible linéaire est très simple. Ses méthodes de création et de suppression complètent principalement l'application et la libération des ressources mémoire décrivant la structure utilisée par le périphérique cible linéaire. La mise en œuvre de la méthode de traitement du mappage IO est encore plus simple, comme le montre le code suivant :
La méthode de mappage consiste à rediriger la demande bio envoyée au périphérique logique mappé de manière linéaire en fonction de la relation de mappage vers l'emplacement correspondant du périphérique physique représenté par le périphérique cible linéaire As. indiqué dans le code, la méthode de mise en œuvre spécifique consiste à modifier le bi_bdev de bio. Le pointeur de périphérique est le pointeur de périphérique correspondant au périphérique cible et modifie le numéro de secteur bi_sector où la requête IO commence en fonction de l'adresse de départ du périphérique cible et la valeur de décalage de la demande bio sur le périphérique mappé, complétant ainsi la redirection de la demande IO. L'implémentation d'autres pilotes cibles est également similaire. Vous pouvez l'implémenter selon les spécifications d'interface définies par le mappeur de périphérique et combiner les fonctions dont vous avez besoin. Je ne les présenterai pas une par une ici. dans le noyau. (T114)static int linear_map(struct dm_target *ti, struct bio *bio, union map_info *map_context) { struct linear_c *lc = (struct linear_c *) ti->private; bio->bi_bdev = lc->dev->bdev; bio->bi_sector = lc->start + (bio->bi_sector - ti->begin); return 1; }
Ce qui précède est le contenu du mécanisme Device Mapper (1) (5) dans le noyau du système Linux. Pour plus de contenu connexe, veuillez faire attention au site Web chinois PHP. (www.php.cn) !