Bagaimana cara kerja partprobe?

12

Saya sedang mencari cara untuk me-refresh bus scsi (atau bus lain, dalam hal ini) yang memungkinkan kernel saya (2.6.18-194-el5 pada CentOS 5.5) untuk mengetahui tentang partisi pada drive, dan saya tidak bisa dapat menemukan jalan. partprobe melakukannya secara instan. Bagaimana?

Karena ini penting, inilah yang saya lakukan:

Saya ingin mendapatkan latihan dalam hal-hal khusus partisi seperti mengubah ukuran, membuat cadangan MBR dan memulihkannya, dan sebagainya. Saya telah membuat partisi 20GB di / dev / sdb, mendukung MBR:

dd jika = / dev / sdb = sdb.mbr bs = 512 count = 1

kemudian saya pergi ke fdisk, menghapus partisi, menulisnya, dan keluar.

ls / dev / sdb *

menunjukkan bahwa tidak ada partisi, dan

fdisk -l / dev / sdb '

cocok, jadi saya pikir saya baik.

Saya kemudian membalikkan dd:

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

Tentu saja, saya tidak melakukan apa-apa pada saat itu, jadi

ls / dev / sdb *

tidak mencantumkan partisi apa pun, tetapi

fdisk -l

menunjukkan partisi tersebut, mungkin karena ia membaca 512 byte pertama pada disk dan tidak bergantung pada kernel. Saya tahu bahwa saya harus menyegarkan bus, jadi saya masuk ke / sys / class / scsi_host / host1, dan melakukan

gema "- - -"> pindai

dan melakukan

ls / dev / sdb

tidak menunjukkan sesuatu yang baru, jadi saya pergi ke / sys / bus / scsi / devices dan untuk masing-masing perangkat yang terdaftar, saya lakukan

gema 1> pindai ulang

dan itu tidak berhasil.

Saya kemudian melakukan penelitian lebih lanjut tentang masalah ini, dan menemukan 'partprobe', yang datang dengan berpisah. Saya menjalankannya, dan itu berhasil seketika.

Jika saya tidak mendapatkan jawaban yang mungkin di sini, saya mungkin akan mencari sumbernya dan mencarinya, tetapi saya pikir ada penyihir di sini di luar saya, jadi saya pikir saya akan menarik bagi Anda semua.

Matt Simmons
sumber

Jawaban:

12

Partprobe memanggil BLKRRPARTioctl, yang didokumentasikan dalam, err include/linux/fs.h,, dan di luar itu sumber kernel (daging ada di rescan_partitions()):

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

Cara termudah untuk mengetahui hal ini adalah dengan berlari strace -e raw=ioctl -e open,ioctl partprobe /dev/sdb.

Saya pikir apa yang Anda coba /sys/*/*scankatakan memberitahu kernel untuk memeriksa apakah ada perubahan drive. Itu tidak membantu jika drive tidak berubah (atau telah ditukar dengan cara yang tidak terdeteksi oleh kernel?) Tetapi struktur partisi di dalamnya telah berubah.

Gilles 'SANGAT berhenti menjadi jahat'
sumber