Jak działa Partprobe?

12

Szukałem sposobu na odświeżenie magistrali scsi (lub jakiejkolwiek innej magistrali), która pozwoliłaby mojemu jądru (2.6.18-194-el5 na CentOS 5.5) dowiedzieć się o partycjach na dysku, i nie mogłem nie ma sposobu. partprobe zrobiło to natychmiast. W jaki sposób?

Ponieważ jest to ważne, oto co robiłem:

Chciałem poćwiczyć trochę rzeczy związanych z partycjami, takich jak zmiana rozmiaru, tworzenie kopii zapasowej MBR i przywracanie go, i tak dalej. Utworzyłem partycję 20 GB na / dev / sdb, utworzyłem kopię zapasową MBR:

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

potem poszedłem do fdisk, usunąłem partycję, napisałem ją i wyszedłem.

ls / dev / sdb *

pokazał, że nie było podziału, oraz

fdisk -l / dev / sdb '

dopasowane, więc pomyślałem, że jestem dobry.

Następnie odwróciłem dd:

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

Oczywiście w tym momencie nic nie zrobiłem

ls / dev / sdb *

nie wyświetlał żadnych partycji, ale

fdisk -l

pokazał partycję, prawdopodobnie dlatego, że czyta pierwsze 512 bajtów na dysku i nie polega na jądrze. Wiedziałem, że muszę odświeżyć autobus, więc wszedłem do / sys / class / scsi_host / host1 i zrobiłem

echo "- - -"> skanowanie

i robić

ls / dev / sdb

nie pokazałem nic nowego, więc poszedłem do / sys / bus / scsi / devices i dla każdego z wymienionych urządzeń zrobiłem

echo 1> ponowne skanowanie

i to nie działało.

Następnie przeprowadziłem więcej badań nad tym problemem i natknąłem się na „partprobe”, który pochodzi z parted. Uruchomiłem go i zadziałało natychmiast.

Jeśli nie otrzymam tutaj prawdopodobnej odpowiedzi, prawdopodobnie po prostu pójdę po źródło i sprawdzę je, ale sądzę, że są tu czarodzieje poza mną, więc pomyślałem, że spodobałbym się wam wszystkim.

Matt Simmons
źródło

Odpowiedzi:

12

Partprobe wywołuje BLKRRPARTioctl, który jest udokumentowany w, err include/linux/fs.hi poza tym źródłem jądra (mięso jest w rescan_partitions()):

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

Najłatwiejszym sposobem na sprawdzenie tego jest uruchomienie strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Myślę, że to, co próbowałeś, /sys/*/*scankaże jądru sprawdzić, czy nastąpiła zmiana napędu. To nie pomaga, jeśli dysk się nie zmienił (lub został zamieniony w taki sposób, że jądro go nie wykrywa?), Ale zmieniła się struktura partycji.

Gilles „SO- przestań być zły”
źródło