Come funziona partprobe?


12

Stavo cercando un modo per aggiornare il bus scsi (o qualsiasi altro bus, per quella materia) che avrebbe permesso al mio kernel (2.6.18-194-el5 su CentOS 5.5) di conoscere le partizioni su un disco, e non potevo trovare un modo. partprobe l'ha fatto all'istante. Come?

Dal momento che è importante, ecco cosa stavo facendo:

Volevo esercitarmi in cose specifiche della partizione come il ridimensionamento, il backup dell'MBR e il ripristino, e così via. Avevo creato una partizione da 20 GB su / dev / sdb, con il backup dell'MBR:

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

poi sono entrato in fdisk, ho cancellato la partizione, l'ho scritto e sono uscito.

ls / dev / sdb *

ha mostrato che non c'era partizione e

fdisk -l / dev / sdb '

abbinato, quindi ho pensato di essere bravo.

Ho quindi invertito il dd:

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

Certo, a quel punto non ho fatto nulla

ls / dev / sdb *

non ha elencato alcuna partizione, ma

fdisk -l

ha mostrato la partizione, presumibilmente perché legge i primi 512 byte sul disco e non si basa sul kernel. Sapevo che avrei dovuto aggiornare il bus, quindi sono entrato in / sys / class / scsi_host / host1 e l'ho fatto

echo "- - -"> scan

e facendo

ls / dev / sdb

non ho mostrato nulla di nuovo, quindi sono passato a / sys / bus / scsi / devices e per ciascuno dei dispositivi elencati ho fatto

echo 1> rescan

e quello non ha funzionato.

Ho quindi fatto ulteriori ricerche sul problema e mi sono imbattuto in "partprobe", che viene fornito con parted. L'ho eseguito e ha funzionato all'istante.

Se non avrò una probabile risposta qui, probabilmente andrò semplicemente a cercare la fonte e a cercarla, ma immagino che ci siano maghi qui oltre a me, quindi ho pensato di fare appello a tutti voi.

Risposte:


12

Partprobe chiama BLKRRPARTioctl, che è documentato in, err include/linux/fs.h, e oltre che il sorgente del kernel (la carne è dentro rescan_partitions()):

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

Il modo più semplice per scoprirlo è eseguire strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Penso che ciò che hai provato /sys/*/*scandice al kernel di verificare se c'è stato un cambio di unità. Ciò non aiuta se l'unità non è cambiata (o è stata sostituita da un hotswap in un modo che il kernel non rileva?) Ma la struttura della partizione su di essa è cambiata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.