¿Cómo funciona partprobe?

12

Estaba buscando una manera de actualizar el bus scsi (o cualquier otro bus, para el caso) que permitiera que mi kernel (2.6.18-194-el5 en CentOS 5.5) supiera sobre las particiones en una unidad, y no pude No encuentro el camino. partprobe lo hizo al instante. ¿Cómo?

Como es importante, esto es lo que estaba haciendo:

Quería practicar un poco en cosas específicas de la partición, como cambiar el tamaño, hacer una copia de seguridad del MBR y restaurarlo, y así sucesivamente. Había creado una partición de 20GB en / dev / sdb, hice una copia de seguridad del MBR:

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

luego entré en fdisk, eliminé la partición, la escribí y salí.

ls / dev / sdb *

mostró que no había partición, y

fdisk -l / dev / sdb '

coincidía, así que pensé que era bueno.

Luego invertí el dd:

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

Por supuesto, no hice nada en ese momento, así que

ls / dev / sdb *

no enumeró ninguna partición, pero

fdisk -l

mostró la partición, presumiblemente porque lee los primeros 512 bytes en el disco y no depende del núcleo. Sabía que tendría que actualizar el autobús, así que entré en / sys / class / scsi_host / host1, e hice

echo "- - -"> escanear

y haciendo

ls / dev / sdb

no mostró nada nuevo, así que fui a / sys / bus / scsi / devices y para cada uno de los dispositivos enumerados, hice

echo 1> reescanear

Y eso no funcionó.

Luego investigué más sobre el problema y encontré 'partprobe', que viene con parted. Lo ejecuté y funcionó al instante.

Si no obtengo una respuesta probable aquí, probablemente iré a buscar la fuente y buscarla, pero creo que hay magos aquí más allá de mí, así que pensé en apelar a todos ustedes.

Matt Simmons
fuente

Respuestas:

12

Partprobe llama al BLKRRPARTioctl, que está documentado en, err include/linux/fs.h, y más allá de eso la fuente del núcleo (la carne está en rescan_partitions()):

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

La forma más fácil de descubrir esto es correr strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Creo que lo que probaste /sys/*/*scanle dice al núcleo que compruebe si ha habido un cambio de unidad. Eso no ayuda si la unidad no ha cambiado (o ha sido cambiada de manera que el núcleo no detecta), pero la estructura de la partición ha cambiado.

Gilles 'SO- deja de ser malvado'
fuente