내 커널(CentOS 5.5의 2.6.18-194-el5)이 드라이브의 파티션을 인식할 수 있도록 scsi 버스(또는 다른 버스)를 플러시하는 방법을 찾고 있는데 방법을 찾을 수 없습니다. . partprobe가 바로 해냈습니다. 어떻게?
이것이 중요하기 때문에 제가 하고 있는 일은 다음과 같습니다.
크기 조정, MBR 백업 및 복원 등과 같은 파티션 관련 작업에 대해 연습하고 싶습니다. /dev/sdb에 20GB 파티션을 생성하고 MBR을 백업했습니다.
dd if=/dev/sdb of=sdb.mbr bs=512 개수=1
그런 다음 fdisk로 가서 파티션을 삭제하고 거기에 쓴 다음 종료합니다.
ls /dev/sdb*
파티션이 표시되지 않으며
fdisk -l /dev/sdb'
일치해서 괜찮은 것 같아요.
그런 다음 dd를 뒤집었습니다.
dd if=sdb.mbr of=/dev/sdb bs=512 개수=1
물론 그 당시에는 아무것도 하지 않았기 때문에
ls /dev/sdb*
파티션이 나열되어 있지 않지만
fdisk -l
분할이 표시되는데, 이는 아마도 디스크의 처음 512바이트를 읽고 커널에 의존하지 않기 때문일 것입니다. 버스를 비워야 한다는 것을 알고 있으므로 /sys/class/scsi_host/host1로 이동하여 다음을 수행합니다.
에코 "- - -" > 스캔
그리고 할
ls /dev/sdb
새로운 내용이 표시되지 않아 /sys/bus/scsi/devices로 이동하여 나열된 각 장치에 대해 해당 작업을 수행했습니다.
에코 1 > 다시 검색
그러나 이것은 작동하지 않습니다.
그런 다음 문제에 대해 더 많은 조사를 수행하고 parted와 함께 제공되는 "partprobe"를 발견했습니다. 실행했더니 바로 작동하더군요.
여기서 가능한 답변을 얻지 못하면 아마도 소스 코드를 구해서 찾아볼 것입니다. 그러나 여기에는 저보다 더 강력한 가이드가 있다고 생각하므로 여러분 모두에게 어필할 수 있다고 생각했습니다.
답변1
Partprobe가 BLKRRPART
ioctl을 호출하면 파일이 err에 기록됩니다.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
드라이브가 변경되었는지 확인하도록 커널에 지시하는 것입니다. 드라이브가 변경되지 않았지만(또는 커널이 감지할 수 없는 방식으로 핫 플러그되었습니까?) 드라이브의 파티션 구조가 변경된 경우에는 도움이 되지 않습니다.