Como o partprobe funciona?

11

Eu estava procurando uma maneira de atualizar o barramento scsi (ou qualquer outro barramento) que permitiria ao meu kernel (2.6.18-194-el5 no CentOS 5.5) saber sobre as partições de uma unidade, e eu não consegui encontrar um caminho. partprobe fez isso instantaneamente. Como?

Como é importante, aqui está o que eu estava fazendo:

Eu queria praticar em coisas específicas da partição, como redimensionar, fazer o backup do MBR e restaurá-lo, e assim por diante. Eu tinha criado uma partição de 20GB em / dev / sdb, copiei o MBR:

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

depois eu 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'

combinou, então eu percebi que era bom.

Eu então inverti o dd:

dd if=sdb.mbr of=/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

echo "- - -" > scan

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, eu fiz

echo 1 > rescan

e isso não funcionou.

Eu então fiz mais pesquisas sobre o problema e encontrei o 'partprobe', que vem com o parted. Eu corri e funcionou instantaneamente.

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

    
por Matt Simmons 14.11.2010 / 21:43

1 resposta

12

O Partprobe chama o BLKRRPART ioctl, que está documentado em, err, include/linux/fs.h , e além disso, a fonte do kernel (a carne está em 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 .

Acho que o que você tentou com /sys/*/*scan diz ao kernel para verificar se houve uma mudança de unidade. Isso não ajuda se a unidade não tiver mudado (ou tenha sido colocada em hotswap de uma forma que o kernel não detecta?), Mas a estrutura da partição nela mudou.

    
por 14.11.2010 / 22:23