Comment fonctionne partprobe?

12

Je cherchais un moyen de rafraîchir le bus scsi (ou tout autre bus, d'ailleurs) qui permettrait à mon noyau (2.6.18-194-el5 sur CentOS 5.5) de connaître les partitions sur un lecteur, et je ne pouvais pas 'trouver un moyen. partprobe l'a fait instantanément. Comment?

Comme c'est important, voici ce que je faisais:

Je voulais me familiariser avec des choses spécifiques à la partition comme le redimensionnement, la sauvegarde du MBR et sa restauration, etc. J'avais créé une partition de 20 Go sur / dev / sdb, sauvegardé le MBR:

dd if = / dev / sdb of = sdb.mbr bs = 512 count = 1

puis je suis allé dans fdisk, j'ai supprimé la partition, je l'ai écrite et j'ai quitté.

ls / dev / sdb *

a montré qu'il n'y avait pas de partition, et

fdisk -l / dev / sdb '

assorti, donc je pensais que j'étais bon.

J'ai ensuite inversé le dd:

dd if = sdb.mbr of = / dev / sdb bs = 512 count = 1

Bien sûr, je n'ai rien fait à ce moment-là, donc

ls / dev / sdb *

n'a pas répertorié de partitions, mais

fdisk -l

a montré la partition, probablement parce qu'elle lit les 512 premiers octets du disque et ne dépend pas du noyau. Je savais que je devrais rafraîchir le bus, alors je suis allé dans / sys / class / scsi_host / host1, et je l'ai fait

echo "- - -"> scan

et faire

ls / dev / sdb

n'a rien montré de nouveau, alors je suis allé dans / sys / bus / scsi / devices et pour chacun des périphériques listés, j'ai fait

écho 1> réanalyser

et cela n'a pas fonctionné.

J'ai ensuite fait plus de recherches sur le problème et suis tombé sur «partprobe», qui vient avec parted. Je l'ai couru et cela a fonctionné instantanément.

Si je n'obtiens pas de réponse probable ici, je vais probablement aller chercher la source et la rechercher, mais je pense qu'il y a des sorciers ici au-delà de moi, alors j'ai pensé que je ferais appel à vous tous.

Matt Simmons
la source

Réponses:

12

Partprobe appelle l' BLKRRPARTioctl, qui est documenté dans, err include/linux/fs.h, et au-delà, la source du noyau (la viande est dedans rescan_partitions()):

#define BLKRRPART  _IO(0x12,95) /* re-read partition table */

Le moyen le plus simple de le découvrir est de s'exécuter strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Je pense que ce que vous avez essayé /sys/*/*scanindique au noyau de vérifier s'il y a eu un changement de lecteur. Cela n'aide pas si le lecteur n'a pas changé (ou a été échangé d'une manière que le noyau ne détecte pas?) Mais la structure de la partition sur celui-ci a changé.

Gilles 'SO- arrête d'être méchant'
la source