번호가 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을 통해 얻은 장치 번호에 영향을 미칩니다.lsof
ps
st_rdev
major:minor
devpts
TIOCGDEV
Linux에서 프로세스의 제어 터미널을 식별하는 신뢰할 수 있는 방법은 없는 것 같습니다.