Wie funktioniert partprobe?

12

Ich suchte nach einer Möglichkeit, den SCSI-Bus (oder jeden anderen Bus) zu aktualisieren, damit mein Kernel (2.6.18-194-el5 unter CentOS 5.5) über die Partitionen auf einem Laufwerk Bescheid weiß, und ich konnte nicht finde keinen Weg. partprobe hat es sofort geschafft. Wie?

Da es wichtig ist, habe ich Folgendes getan:

Ich wollte etwas Übung in partitionsspezifischen Dingen wie Größenänderung, Sicherung und Wiederherstellung des MBR und so weiter. Ich hatte eine 20 GB Partition auf / dev / sdb erstellt und den MBR gesichert:

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

Dann ging ich zu fdisk, löschte die Partition, schrieb sie und verließ sie.

ls / dev / sdb *

zeigte, dass es keine Partition gab, und

fdisk -l / dev / sdb '

abgestimmt, also dachte ich, ich sei gut.

Ich habe dann die dd umgekehrt:

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

Natürlich habe ich zu diesem Zeitpunkt nichts getan

ls / dev / sdb *

hat keine Partitionen aufgelistet, aber

fdisk -l

hat die Partition angezeigt, vermutlich, weil sie die ersten 512 Bytes auf der Festplatte liest und nicht auf den Kernel angewiesen ist. Ich wusste, dass ich den Bus auffrischen musste, also ging ich in / sys / class / scsi_host / host1 und tat es

Echo "- - -"> Scan

und zu tun

ls / dev / sdb

habe nichts Neues angezeigt, also bin ich zu / sys / bus / scsi / devices gegangen und habe dies für jedes der aufgelisteten Geräte getan

echo 1> rescan

und das hat nicht funktioniert.

Ich habe dann mehr über das Problem geforscht und bin auf partprobe gestoßen, das mit parted geliefert wird. Ich habe es ausgeführt und es hat sofort funktioniert.

Wenn ich hier keine wahrscheinliche Antwort bekomme, gehe ich wahrscheinlich einfach zur Quelle und schaue nach, aber ich schätze, es gibt Zauberer hier außerhalb von mir, also dachte ich, ich würde Sie alle ansprechen.

Matt Simmons
quelle

Antworten:

12

Partprobe nennt das BLKRRPARTioctl, das in, err, include/linux/fs.hund darüber hinaus in der Kernelquelle (das Fleisch ist in rescan_partitions()) dokumentiert ist :

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

Der einfachste Weg, dies herauszufinden, ist zu rennen strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Ich denke, was Sie versucht haben, /sys/*/*scansagt dem Kernel, dass er prüfen soll, ob ein Laufwerkswechsel stattgefunden hat. Das hilft nicht, wenn sich das Laufwerk nicht geändert hat (oder wenn ein Hot-Swap durchgeführt wurde, den der Kernel nicht erkennt?), Sich aber die Partitionsstruktur geändert hat.

Gilles 'SO - hör auf böse zu sein'
quelle