Como o partprobe funciona?

12

Eu estava procurando uma maneira de atualizar o barramento scsi (ou qualquer outro barramento, por sinal) que permitisse ao meu kernel (2.6.18-194-el5 no CentOS 5.5) conhecer as partições em uma unidade e não consegui encontre um caminho. partprobe fez isso instantaneamente. Quão?

Como é importante, eis o que eu estava fazendo:

Eu queria ter alguma prática em coisas específicas da partição, como redimensionar, fazer backup do MBR e restaurá-lo, e assim por diante. Eu criei uma partição de 20 GB em / dev / sdb, com backup do MBR:

dd se = / dev / sdb de = sdb.mbr bs = 512 count = 1

depois entrei no fdisk, apaguei a partição, escrevi e saí.

ls / dev / sdb *

mostrou que não havia partição e

fdisk -l / dev / sdb '

combinado, então achei que era bom.

Eu invertei o dd:

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

Claro, eu não fiz nada naquele momento, então

ls / dev / sdb *

não listou nenhuma partição, mas

fdisk -l

mostrou a partição, presumivelmente porque lê os primeiros 512 bytes no disco e não depende do kernel. Eu sabia que teria que atualizar o barramento, então entrei em / sys / class / scsi_host / host1 e fiz

eco "- - -"> varredura

e fazendo

ls / dev / sdb

não mostrou nada de novo, então fui para / sys / bus / scsi / devices e, para cada um dos dispositivos listados,

eco 1> redigitalizar

e isso não funcionou.

Fiz mais pesquisas sobre o problema e me deparei com 'partprobe', que vem com o parted. Eu executei e funcionou instantaneamente.

Se eu não conseguir uma resposta provável aqui, provavelmente vou buscar a fonte e procurar, mas acho que existem bruxos aqui além de mim, então pensei em apelar para todos vocês.

Matt Simmons
fonte

Respostas:

12

O Partprobe chama o BLKRRPARTioctl, que está documentado em, err include/linux/fs.he além da fonte do kernel (a carne está dentro rescan_partitions()):

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

A maneira mais fácil de descobrir isso é executar strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Eu acho que o que você tentou /sys/*/*scandiz ao kernel para verificar se houve uma mudança de unidade. Isso não ajuda se a unidade não tiver sido alterada (ou tiver sido afetada de maneira que o kernel não detecte?), Mas a estrutura da partição nele tenha sido alterada.

Gilles 'SO- parar de ser mau'
fonte