메이저 번호와 마이너 번호가 고유합니까?

메이저 번호와 마이너 번호가 고유합니까?

번호가 major, minor고유한가요?

인용이나 참고 자료가 있나요?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

답변1

~에서리눅스 프로그래밍 인터페이스, §14.1

각 장치 파일에는 주 ID 번호와 부 ID 번호가 있습니다. 주요 ID는 일반적인 장치 클래스를 식별하며 커널이 해당 장치에 적합한 드라이버를 찾는 데 사용됩니다. 보조 ID는 공통 카테고리 내에서 특정 장치를 고유하게 식별합니다. 장치 파일의 주 및 부 ID는 ls -l 명령을 사용하여 표시됩니다.

[...]

각 장치 드라이버는 특정 마스터 장치 ID와의 연결을 등록하고 해당 연결은 장치 특수 파일과 장치 간의 연결을 제공합니다. 커널이 장치 드라이버를 찾을 때 장치 파일의 이름은 중요하지 않습니다.

이전 버전(2001)도 참조하세요.리눅스 장치 드라이버장 (2e).

즉, 각 장치 유형에 대해 기본:보조와 장치:인스턴스의 고유한 매핑을 제공하는 것이 목적입니다. 엄밀히 말하면 당신은할 수 있는하나는 문자이고 다른 하나는 블록인 경우 동일한 메이저:마이너를 갖는 두 개의 서로 다른 장치가 있습니다.

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

리눅스에서는,시스템의 어느 시점에서나메이저:마이너 번호각 장치 유형에 대해독특하다. 그러나 이러한 숫자는 시간이 지남에 따라 변경될 수 있으며 다른 Linux 시스템(동일한 배포판, 커널 및 하드웨어라도)에서 반드시 동일하지는 않습니다. 문자 및 블록 장치에는 서로 다른 번호 지정 공간이 있습니다. 예를 들어 블록 마스터 1은 RAM 디스크에 할당되고 문자 마스터 1은 커널 장치 세트(null 및 0 포함)에 할당됩니다.

역사적으로 장비 전공자는 (대부분)정적으로통해 할당등록부(유지관리되지는 않지만 커널 소스 코드에는 여전히 존재합니다 Documentation/devices.txt.) 오늘날에는 많은 장치가 동적으로 할당됩니다.우데브, 매핑은 에서 볼 수 있습니다 /proc/devices. 고정 장비가 여전히 존재합니다.incude/uapi/linux/major.h(최근 에서 이동함 include/major.h)

이제 기본:부 조합이 특정 장치 인스턴스를 고유하게 식별하지만 동일한 장치를 참조하는 여러 장치 노드(파일)를 생성하는 데 방해가 되지 않습니다. 생성할 필요도 없습니다 /dev(그러나 장치 노드 생성을 지원하는 파일 시스템에 있어야 하며 nodev해당 옵션으로 설치되어서는 안 됩니다).

일반적인 용도는 chroot에 중복된 0, null 및 임의 장치를 만드는 것입니다.

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

이름은 단지 별칭일 뿐이며 커널은 대부분의 이름이나 위치에 크게 신경 쓰지 않고 올바른 드라이버를 선택할 수 있도록 메이저 번호에 관심을 갖고 드라이버는 (보통) 드라이버를 선택할 수 있도록 마이너 번호에 관심을 갖습니다. 올바른 사례.

대부분의 이름은 단지 관습적일 뿐입니다(비록일부는 POSIX에 의해 정의됩니다.). 또한 장치는 여러 주요 장치 번호를 등록할 수 있습니다. sd에서 드라이버를 확인 하십시오 /proc/devices. 드라이버 모듈 이름( .ko)은 장치 이름과 동일할 필요도 없고 장치 노드와 동일할 필요도 없습니다. /dev, 단일 드라이버 모듈은 여러 논리적/물리적 장치 또는 장치 이름을 관리할 수 있습니다.


요약하자면, 동일한 메이저:마이너 번호를 가진 두 개 이상의 장치 노드(그 내부 또는 다른 위치)가 있을 수 있지만, /dev/동일한 유형인 경우 동일한 장치를 참조합니다. 여러 주요 인스턴스를 처리할 수 있는 드라이버가 있을 수 있지만 커널 및 드라이버 내에서 각 유형(문자 또는 블록)에 대해 주요:부 번호는 특정 장치(기본) 및 특정 인스턴스(부 필수)를 참조하는 데 사용됩니다. ) 장비.

유형이 동일하고 기본:보조인 두 개의 장치 노드를 가질 수 없으며 두 노드가 서로 다른 두 개의 논리적 또는 물리적 장치에 액세스할 것으로 예상됩니다. 장치에 접근할 때 커널은 유형과 주요 번호(및아니요특정 인스턴스나 하위 기능은 장치 노드 이름과 관례적으로 마이너 번호를 기준으로 결정적으로 선택됩니다.


고쳐 쓰다 몇 가지 흥미로운 역사와 일부 *BSD 관점은 Poul-Henning Kamp의 2002에서 찾을 수 있습니다.BSDCon프로모션 회의: https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

만약 너라면시간을 거슬러 1978년으로(알카텔-루슨트 제공)벨 시스템 기술 매거진1978년 7~8월)유닉스 시간 공유 시스템'는 명시적으로 말합니다(p1937):

장치는 메이저 번호, 마이너 번호 및 클래스(블록 또는 문자)로 특성화됩니다. 각 클래스마다 장치 드라이버에 대한 진입점 세트가 있습니다. 주요 장치 번호는 특정 장치 드라이버에 대한 코드를 호출할 때 배열을 색인화하는 데 사용됩니다. 부 장치 번호는 장치 드라이버에 매개변수로 전달됩니다. 마이너 번호는 드라이버가 부여한 번호 외에는 아무런 의미가 없습니다. 일반적으로 드라이버는 부 장치 번호를 사용하여 여러 개의 동일한 물리적 장치 중 하나에 액세스합니다.

답변2

장치 파일 생성 시 mknode및 번호가 제공됩니다 major. minor이는 Linux가 장치 파일과 연관된 기본 하드웨어 장치를 식별하는 방법입니다. 대부분의 경우 major번호로 드라이버를 식별하고 minor드라이버가 제어하는 ​​다양한 장치를 구별합니다.

따라서 각 장치의 번호는 고유해야 합니다. 그렇지 않으면 모든 장치에 대해 올바른 장치 파일을 생성할 수 없습니다.

답변3

아니요, Linux에서 항상 고유한 것은 아닙니다.

Linux는 devpts가상 파일 시스템을 사용하여 의사 터미널(ptys)을 제공하며 가상 파일 시스템은 여러 위치에 여러 번 마운트할 수 있으므로 chroot 또는 네임스페이스 컨테이너를 설정할 때 매우 유용합니다. major:minor튜플은 파일 시스템 인스턴스에서는 고유 하지만 devpts실행 중인 시스템에서는 고유하지 않습니다.

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

위의 예에서 script(1)명령은 의사 터미널을 생성하고 그 안에서 쉘을 실행합니다. 분명히 script첫 번째 프로세스에서 생성된 의사 터미널은 두 번째 프로세스에서 생성된 의사 터미널과 다르지만 이름과 메이저 및 마이너 번호가 동일합니다.

의사 터미널을 고유하게 식별하려면 해당 터미널의 튜플을 사용 하거나 (devpts 파일 시스템의) 장치 번호 를 device:inode해당 major:minor. (도구가 /proc/PID/stat에서 정보를 얻는 위치 proc(5))에는 tty(패키지)만 포함됩니다. 이것이 pty 슬레이브인 경우 이를 제공한 파일 시스템에 아무런 표시도 제공되지 않습니다. 동일한 문제가 ioctl을 통해 얻은 장치 번호에 영향을 미칩니다.lsofpsst_rdevmajor:minordevptsTIOCGDEV

Linux에서 프로세스의 제어 터미널을 식별하는 신뢰할 수 있는 방법은 없는 것 같습니다.

관련 정보