답변:
에서 리눅스 프로그래밍 인터페이스 , §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/devices
incude/uapi/linux/major.h
include/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) 명확하게'세트에게 그것을 아웃 :
장치에는 주 장치 번호, 부 장치 번호 및 클래스 (블록 또는 문자)가 있습니다. 각 클래스마다 장치 드라이버에 대한 진입 점 배열이 있습니다. 주요 장치 번호는 특정 장치 드라이버에 대한 코드를 호출 할 때 배열을 색인화하는 데 사용됩니다. 부 장치 번호는 장치 드라이버에 인수로 전달됩니다. 부 번호는 운전자가 부여한 것 외에 다른 의미가 없습니다. 일반적으로 드라이버는 부 번호를 사용하여 여러 동일한 물리적 장치 중 하나에 액세스합니다.
MAJ:Min
번호를 가진 두 개의 장치를 가질 수 있습니다
아니요, 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
그것을 제공 하는 파일 시스템에 대한 표시가 없습니다 . 동일한 문제는 TIOCGDEV
ioctl로 얻을 수있는 장치 번호에 영향을줍니다 .
AFAICS는 Linux에서 프로세스의 제어 터미널을 식별 할 수있는 확실한 방법이 없습니다. 그렇지 않으면 정정 및 제안을 환영합니다!