Как работает partprobe?

12

Я искал способ обновить шину scsi (или любую другую, в этом отношении, шину), которая позволила бы моему ядру (2.6.18-194-el5 на CentOS 5.5) узнать о разделах на диске, и я не мог не найти способ. partprobe сделал это мгновенно. Как?

Поскольку это важно, вот что я делал:

Я хотел немного попрактиковаться в таких вещах, как изменение размера, резервное копирование MBR и его восстановление и так далее. Я создал раздел на 20 ГБ в / dev / sdb, сделал резервную копию MBR:

дд если = / dev / sdb из = sdb.mbr bs = 512 кол = 1

затем я вошел в fdisk, удалил раздел, написал его и вышел.

ls / dev / sdb *

показал, что не было раздела, и

fdisk -l / dev / sdb '

совпал, так что я решил, что я был хорош.

Затем я перевернул дд:

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

Конечно, я ничего не делал в тот момент, поэтому

ls / dev / sdb *

не перечислил никаких разделов, но

fdisk -l

показал раздел, предположительно потому, что он читает первые 512 байт на диске и не полагается на ядро. Я знал, что мне нужно обновить шину, поэтому я вошел в / sys / class / scsi_host / host1 и сделал

echo "- - -"> scan

и делать

ls / dev / sdb

ничего нового не показывалось, поэтому я зашел в / sys / bus / scsi / devices и для каждого из перечисленных устройств сделал

эхо 1> повторное сканирование

и это не сработало.

Затем я провел больше исследований по этой проблеме и наткнулся на «partprobe», который идет с parted. Я запустил его, и он заработал мгновенно.

Если я не получу вероятного ответа здесь, я, вероятно, просто пойду за источником и посмотрю его, но я полагаю, что за мной есть волшебники, поэтому я решил обратиться ко всем вам.

Мэтт Симмонс
источник

Ответы:

12

Partprobe вызывает BLKRRPARTioctl, который задокументирован include/linux/fs.hкак источник ошибки ядра (так и есть rescan_partitions()):

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

Самый простой способ узнать это - бежать strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Я думаю, то, что вы пробовали, /sys/*/*scanговорит ядру проверить, произошла ли смена диска. Это не поможет, если диск не изменился (или был подвергнут горячей замене способом, который не обнаруживает ядро?), Но структура раздела на нем изменилась.

Жиль "ТАК - перестань быть злым"
источник