Existe-t-il de toute façon, avec Linux, pour obliger un périphérique en mode bloc à signaler une erreur d’entrée / sortie, ou éventuellement à en simuler une à des fins de test?
42
Existe-t-il de toute façon, avec Linux, pour obliger un périphérique en mode bloc à signaler une erreur d’entrée / sortie, ou éventuellement à en simuler une à des fins de test?
modprobe
, se comportant comme un périphérique en mode bloc, puis un autre petit programme qui envoieioctl()'s
au pilote pour lui faire renvoyer la valeur souhaitée.Réponses:
Oui, il existe un moyen très plausible de faire cela avec Device Mapper.
Le mappeur de périphérique peut recombiner des périphériques en mode bloc dans un nouveau mappage / ordre de votre choix. LVM le fait. Il prend également en charge d’autres cibles (certaines assez nouvelles) telles que «floconneuse» pour simuler un disque défaillant et «erreur» pour simuler des régions de disque défaillantes.
Il est possible de construire un périphérique dont les points noirs IO sont délibérément signalés et qui signaleront les erreurs IO lorsqu’ils seront croisés.
Commencez par créer un volume virtuel à utiliser en tant que cible et en le rendant adressable en tant que périphérique en mode bloc.
Donc, pour commencer, cela crée un fichier de 512M qui constitue la base de notre périphérique de bloc virtuel dans lequel nous allons percer un "trou". Aucun trou n’existe pour le moment. Si vous
mkfs.ext4 /dev/loop0
deviez le faire, vous obtiendrez un système de fichiers parfaitement valide.Donc, utilisons dmsetup qui, en utilisant ce périphérique bloc - créera un nouveau périphérique qui comporte des trous. Voici un exemple d'abord
Cela créera un périphérique appelé 'errdev0' (généralement dans / dev / mapper). Lorsque vous tapez,
dmsetup create errdev0
il attend stdin et se termine lorsque ^ D est entré.Dans l'exemple ci-dessus, nous avons créé un trou de 5 secteurs (2,5 Ko) au niveau des secteurs 261144 du dispositif de boucle. Nous continuons ensuite à travers le périphérique de boucle comme d’habitude.
Ce script tentera de vous générer une table qui placera des trous à des emplacements aléatoires répartis approximativement autour de 16 Mo (bien que ce soit plutôt aléatoire).
Le script suppose que vous avez également créé un périphérique de 512 Mo et que votre périphérique de bloc virtuel est activé
/dev/loop0
.Vous pouvez simplement exporter ces données dans un fichier texte sous forme de tableau et les canaliser
dmsetup create errdev0
.Une fois que vous avez créé le périphérique, vous pouvez commencer à l'utiliser comme un périphérique en mode bloc, en le formatant d'abord, puis en y plaçant des fichiers. À un moment donné, vous devriez rencontrer des problèmes d'E / S dans lesquels vous touchez des secteurs qui sont vraiment des trous d'E / S dans le périphérique virtuel.
Une fois que vous avez terminé, utilisez
dmsetup remove errdev0
pour supprimer le périphérique.Si vous souhaitez augmenter les risques d’erreurs IO, vous pouvez ajouter des trous plus fréquemment ou modifier la taille des trous créés. Notez que mettre des erreurs dans certaines sections est susceptible de causer des problèmes dès le départ, IE à 32 Mo dans un appareil que vous ne pouvez pas écrire dans un superbloc que ext essaie normalement de faire, de sorte que le format ne fonctionnera pas.
Pour plus de plaisir, vous pouvez le faire à ce moment-
losetup
làmkfs.ext4 /dev/loop0
et le remplir de données. Une fois que vous avez un bon système de fichiers, démontez-le simplement, ajoutez des trous à l'aide de dmsetup et remontez-le!la source
Pour vérifier la robustesse du programme en cas d'échec de la sortie, vous pouvez utiliser le pseudodevice
/dev/full
, qui renvoie toujours "ENOSPACE" lorsqu'il est écrit.la source
Cela dépend de ce que vous voulez tester. En utilisant une
LD_PRELOAD
bibliothèque ed, vous pouvez amener les applications à penser des choses telles que «toutes les écritures échouentENOSPC
ouEIO
», par exemple.la source
Vous pouvez le faire de tant de façons intéressantes. Voir https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
la source
fail_make_request
)? Serait également bon pour empêcher la pourriture du lien.Peut-être pourriez-vous changer la table de partition et agrandir la partition telle qu'elle est réellement. Cela provoquerait probablement une erreur d'entrée-sortie. Ou, si vos disques sont connectables à chaud, vous pouvez simplement en retirer un.
la source