있습니까 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상기 major와 minor번호가 공급된다. 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에서 프로세스의 제어 터미널을 식별 할 수있는 확실한 방법이 없습니다. 그렇지 않으면 정정 및 제안을 환영합니다!
