[unix] 전공, 부전공이 독특합니까?

있습니까 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



답변

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

각 장치 파일에는 주 ID 번호와 부 ID 번호가 있습니다. 주요 ID는 일반적인 장치 클래스를 식별하며 커널이이 유형의 장치에 적합한 드라이버를 찾기 위해 사용합니다. 부 ID는 일반 클래스 내에서 특정 장치를 고유하게 식별합니다. 장치 파일의 주 및 부 ID는 ls -l 명령으로 표시됩니다.

[…]

각 장치 드라이버는 특정 주요 장치 ID와의 연결을 등록하며이 연결은 장치 특수 파일과 장치 간의 연결을 제공합니다. 커널이 장치 드라이버를 찾을 때 장치 파일의 이름은 관련이 없습니다.

이 오래된 (2001) Linux 장치 드라이버 (2e) 장도 참조하십시오 .

즉, 각 유형의 장치에 대해 major : minor와 device : instance를 고유하게 매핑하는 것이 목적입니다. 엄밀히 말하면, 하나는 문자이고 하나는 블록 인 한, 같은 주요 장치를 가진 두 개의 다른 장치를 가질 있습니다.

# 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 에서 한 시스템어느 시점에서나 각 유형의 장치에 대한 주요 : 부 숫자 는 고유합니다. 그러나 숫자는 시간이 지남에 따라 변경 될 수 있으며 다른 Linux 시스템 (같은 배포, 커널 및 하드웨어)에서 동일 할 필요는 없습니다. 문자 및 블록 장치에는 고유 한 번호 공간이 있습니다. 예를 들어 블록 주 1은 RAM 디스크에 할당되고, 문자 주 1은 널 및 0을 포함한 커널 장치 세트에 지정됩니다.

역사적으로 장치 메이저는 레지스트리를 통해 (대부분) 정적으로 할당 되었습니다 ( 커널 소스에는 유지되지는 않았지만 여전히 존재합니다 ). 요즘 많은 장치가 동적으로 할당되며,이 장치는 udev 에 의해 관리되며 매핑은에서 볼 수 있습니다 . 고정 장치가 여전히 존재합니다 (최근에에서 이동 ).Documentation/devices.txt/proc/devicesincude/uapi/linux/major.hinclude/major.h

major : minor 조합은 특정 장치 인스턴스를 고유하게 식별하지만 동일한 장치를 참조하는 여러 장치 노드 (파일)를 만드는 것을 막을 수있는 것은 없습니다. 그것들은 심지어 생성 될 필요는 없습니다 /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/, 메이저 번호가 같은 두 개 이상의 장치 노드가 있거나 다른 장치 노드 가있을 수 있지만 같은 유형 인 경우 동일한 장치를 나타냅니다. 여러 주요 인스턴스를 처리 할 수있는 하나의 드라이버를 가질 수 있지만 커널 및 드라이버 내에서 각 유형 (char 또는 block)에 대해 major : minor 번호는 특정 장치 (major) 및 특정 인스턴스 ( 장치).

유형과 major : minor가 동일한 두 개의 장치 노드를 가질 수 없으며 두 개의 서로 다른 논리적 또는 물리적 장치에 액세스 할 것으로 예상합니다. 장치에 액세스 할 때 커널은 유형 및 주 번호 ( 장치 노드 이름이 아닌)에 따라 하나의 드라이버를 선택하고, 부 번호는 일반적으로 특정 인스턴스 또는 하위 기능을 결정적으로 선택합니다.


업데이트 할
몇 가지 흥미로운 역사와 몇몇 * BSD의 관점 폴 헤닝 캠프 2002에서 찾을 수 있습니다 BSDCon의 사항
https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

당신이 경우 1978 시간을 거슬러 도약 (알카텔 – 루슨트,의 예의 벨 시스템 기술 저널 ‘1978 7 ~ 8 월) 유닉스 시간 공유 시스템 (p1937) 명확하게’세트에게 그것을 아웃 :

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


답변

장치 파일에 의해 생성되면 mknode상기 majorminor번호가 공급된다. Linux가 장치 파일과 관련된 기본 하드웨어 장치를 식별하는 방법입니다. 대부분의 경우 major드라이버 번호는 드라이버를 식별하는 반면 minor드라이버는 드라이버가 제어하는 ​​다른 장치를 구별합니다.

따라서 숫자는 각 장치마다 고유해야하며 그렇지 않으면 모든 장치에 대해 올바른 장치 파일을 만들 수 없습니다.


답변

아니요, Linux에서는 항상 고유하지는 않습니다.

Linux는 devpts가상 파일 시스템을 사용하여 의사 터미널 (pty)을 제공 하고 있으며 가상 파일 시스템을 두 번 이상 다른 위치에 마운트 할 수 있으므로 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프로세스에 의해 생성 된 의사 터미널이 두 번째 프로세스에 의해 생성 된 의사 터미널 과 동일하지 않지만 이름과 주요 부수가 동일 하다는 것은 분명합니다 .

의사 터미널을 고유하게 식별하려면 device:inode튜플 을 사용 하거나 (devpts 파일 시스템의) 장치 번호 와을 조합해야 major:minor합니다. 문제는의 “TTY”필드이다 /proc/PID/stat(7에서, 참조 proc(5), 어디 도구처럼 맨 페이지를 lsof하거나 ps에만 포함에서 자신의 정보를 얻을) st_rdev청각 장애 ((가) 포장의 major:minor); 그것이 pty 슬레이브라면 devpts그것을 제공 하는 파일 시스템에 대한 표시가 없습니다 . 동일한 문제는 TIOCGDEVioctl로 얻을 수있는 장치 번호에 영향을줍니다 .

AFAICS는 Linux에서 프로세스의 제어 터미널을 식별 할 수있는 확실한 방법이 없습니다. 그렇지 않으면 정정 및 제안을 환영합니다!


답변