나는 일반적으로 주어진 장치에 대해 전체 주요/부 장치 번호 지정이 어떻게 작동하는지 이해하며(여기서 멀리 떨어져 있으면 수정해 주십시오), 주요 장치 번호는 본질적으로 장치 클래스(블록 장치 등)에 연결되어 있습니다. 문자 장치/특수 문자), 부 번호는 해당 장치 아래의 특정 유형의 장치와 연결됩니다. 이 숫자를 기반으로 커널은 장치와 상호 작용하는 데 필요한 장치 드라이버를 결정할 수 있습니다. 파일 시스템 수준에서 장치 번호는 inode stat 구조에 저장되므로 파일을 사용자로 지정하면 장치 ID가 2바이트 값으로 반환됩니다. 여기서 높은 바이트와 낮은 바이트는 기본 장치를 나타냅니다. 및 낮은 장비. 각각 마이너 번호입니다. stat 구조에는 이 형식으로 장치 ID를 지정하기 위한 2개의 멤버(st_dev 및 st_rdev)가 있습니다. 여기서 st_dev는 해당 파일이 있는 장치와 관련됩니다(저장 장치의 일반 파일의 경우 st_dev는 파티션의 장치가 됩니다). 기본/보조 파일이 있는 위치).
그러나 파일이 장치가 마운트되지 않았거나 특수 문자 등이 있는 경우 st_dev의 주요 장치 번호는 0으로 설정되고 부 장치 번호는 으로 설정됩니다.무엇대조적으로, st_rdev는 장치 유형을 채울 수도 있고 채우지 않을 수도 있습니다(해당 파일 시스템이 이를 구현하는지 여부에 따라 다름). 그래서 내 질문은,무엇이 인스턴스에서 부 번호를 채우면 사용할 값/사용하는 값을 사용하는 이유를 어떻게 알 수 있습니까?
예를 들어
stat /etc/passwd
=> 장치: 801h, "장치 유형"이 설정되지 않음 - 메이저 번호 8은 SCSI 장치와 관련되고 마이너 번호 1은 파일의 첫 번째 파티션(sda1)과 관련될 것으로 예상됩니다.
stat /dev/sda1
=> Device: 6h, DeviceType: 8,1 -- 여기의 장치(st_dev)에는 메이저 번호 0(예상됨)과 마이너 번호 6이 있습니다. 왜 6인가요?
stat /dev/null
-- 다시 말하지만, 6의 부 버전
stat /proc/version
-- 4의 부 버전
내가 무엇을 놓치고 있나요?
여기서 구조체를 참조하고 있다는 것을 알고 있으며 이 질문은 아마도 스택 오버플로에 더 잘 배치될 것입니다. 그러나 이것이 명확한 개발 질문이라기보다는 낮은 수준의 Linux 질문에 더 가깝다고 생각합니다. 그래도 재배치하게 되어 기쁩니다.
답변1
내 시스템에서는 /proc
yes 6h
, 그리고 /dev
yes 입니다 5h
.
빠른 테스트:
# for x in a b c d e f g h i j; do mkdir $x; mount -t tmpfs tmpfs $x; done
# stat */.
중간에 누락된 숫자가 주어집니다(사용됩니다 33h
). 설치시 첫 번째 여유 번호를 동적으로 할당하여 사용하는 것 같습니다.3dh
35h
/run/user/1000/gvfs
이 숫자는 재사용되므로 적어도 이 경우에는 st_dev
특정 경로에서 파일 시스템이 변경되었는지 감지하는 데 안정적으로 사용할 수 없습니다.