아래의 각 장치 노드 /dev
에는 고유한 주/부 번호 쌍이 있습니다. stat
다음을 통해 장치 노드에서 숫자 쌍을 검색 할 수 있다는 것을 알고 있습니다 .
stat -c 'major: %t minor: %T' <file>
또는 ls -l
숫자도 표시합니다.
하지만 메이저 및 마이너 장치 번호가 주어진 장치 노드를 어떻게 얻을 수 있습니까? 내가 아는 유일한 방법은 일종의 ls -l
+ awk
트릭이지만 더 나은 솔루션을 원합니다.
답변1
나는 다음을 사용하여 더 쉬운 방법을 찾았습니다.체계다음 위치에 있는 의사 파일 시스템/시스템 개발유형별로 장치를 정렬한 다음 기본/보조, 파일 순으로 정렬했습니다.이벤트장치 이름과 기타 여러 정보가 포함되어 있습니다.
예를 들어,
for file in $(find /sys/dev/ -name 7:0); do
source ${file}/uevent; echo $DEVNAME;
done;
에코,
loop0
vcs
참고: 이는 Debian Wheezy에서 테스트되었습니다.
답변2
분명히 더 간단하게 할 수 udevadm
있는데 방금 방법을 찾았습니다.
DEVNAME
이를 얻으려면 udevadm
다음을 수행하면 됩니다.
udevadm info -rq name $PATH
/dev
예를 들어, 자신의 이름을 알고 싶다면 /sys/dev/char/5:1
다음을 수행하세요.
udevadm info -rq name /sys/dev/char/5:1
산출
/dev/console
이 -r
옵션은 --root
ed 경로를 지정합니다. 이 옵션이 없으면 위의 결과는 읽기 전용이 됩니다 console
. 이 옵션은 여기서 피연산자를 허용하는 -q
데이터베이스를 지정합니다 . 왜냐하면 우리가 원하기 때문입니다 .--query
name
DEVNAME
메이저:마이너 숫자만 주어진 경우 문자 및/또는 블록 장치에 대한 경로를 찾는 매우 간단한 방법은 다음과 같습니다.
mmdev() for d in /sys/dev/[cb]*/$1:$2
do [ -e "$d" ] || return
printf %c:%s: "${d#/*/*/}" "${d##*/}"
udevadm info -rq name "$d"
done
따라서 다음을 실행하십시오.
mmdev 8 0
인쇄...
b:8:0:/dev/sda
이것은 내가 쓴 첫 번째 글입니다.
majminpath() {
set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
udevadm info --export-db |
sed 's|^[^=]*DEVNAME=||
\|^[^/]|!h;/MAJOR=/N
\|='"$1\n.*=${2?}"'$|!d;g'
}
이는 udevadm info --export-db
스캔 출력에서 일치하는 숫자일 뿐입니다. 출력은 다음과 같습니다.
P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc
P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc
#...and so on
작업 흐름은 다음과 같습니다.
[^=]*DEVNAME=
각 줄의 시작 부분에서 시도를 제거해 보세요.줄에 첫 번째 문자가 없거나 첫 번째 문자가
/
줄 의h
이전 공백을 복사하는 경우행이 일치하면 확장 입력 행을
MAJOR=
추가합니다.N
패턴 공간에 일치하는 라인이 2개 있으면 이전 공간을 패턴 공간에
=$1\n.*=$2$
복사h
하고 자동으로 인쇄합니다. 그렇지 않으면 패턴 공간을 삭제합니다.
그렇다면 다음과 같이 하세요.
majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1
산출
/dev/vcsa5
/dev/sda
/dev/sda1
그러나 @xae가 지적했듯이 블록/문자 유형 장치는 maj:min 조합을 공유할 수 있으므로 호출마다 여러 경로가 인쇄될 수 있습니다.
답변3
니가 무슨 말하는지 모르겠어.
mknod foo b 8 0
foo
기본 장치가 8이고 보조 장치가 0인 블록 장치라는 장치 파일이 생성됩니다 . /dev
동일한 유형, 주요 장치 및 보조 장치가 있는 하나 이상의 파일을 찾으려면 다음을 수행할 수 있습니다( 사용 zsh
).
블록 장치의 경우
8:0
:$ zmodload zsh/stat $ ls -ld /dev/**/*(-D%be:'zstat -H s $REPLY && (($s[rdev] == 8<<8+0))':) lrwxrwxrwx 1 root root 6 Aug 23 05:28 /dev/block/8:0 -> ../sda lrwxrwxrwx 1 root root 9 Aug 23 05:28 /dev/disk/by-id/ata-KINGSTON_SNV455S234GB_07MA10014418 -> ../../sda brw-rw---- 1 root disk 8, 0 Aug 23 05:28 /dev/sda
캐릭터 장치의 경우
226:0
:$ ls -ld /dev/**/*(-D%ce:'zstat -H s $REPLY && (($s[rdev] == 226<<8+0))':) lrwxrwxrwx 1 root root 12 Aug 23 05:28 /dev/char/226:0 -> ../dri/card0 crw-rw----+ 1 root video 226, 0 Aug 23 05:28 /dev/dri/card0
에는 무엇이든 포함될 수 있습니다 /dev
. 초기에는 정적 파일을 생성하는 스크립트였습니다. 어떤 시점에서는 특별한 파일 시스템을 갖게 될 수도 있습니다 /proc
.
최신 버전의 Linux에서는 일반적으로 udev
커널의 입력을 기반으로 합니다.
기본 장치 파일에 대해 선택하는 이름은 DEVNAME
커널에서 제공하는 이름을 기반으로 합니다. udev
규칙은 이를 변경할 수 있지만 일반적으로 변경되지 않으며 일부 udev
규칙은 사용 편의성을 위해 더 많은 심볼릭 링크를 추가합니다(예: /dev/disk/by...
).
DEVNAME
다음을 보면 major:minor에서 커널로 이동할 수 있습니다.
$ sed -n 's/^DEVNAME=//p' /sys/dev/block/8:0/uevent
sda
$ sed -n 's/^DEVNAME=//p' /sys/dev/char/226:0/uevent
dri/card0
udev
mikeserv가 보여주는 것처럼 데이터베이스에서 이 정보를 얻을 수도 있습니다 .
답변4
/proc
Linux에서는 가상 파일 시스템의 특정 파일을 활용할 수 있습니다 .
$ grep '8[[:blank:]]\+1[[:blank:]]\+' /proc/partitions
8 1 29309568 sda1
$ grep '8:1[[:blank:]]' /proc/self/mountinfo
28 0 8:1 / / rw,relatime shared:1 - ext4 /dev/sda1 rw,data=ordered
이 패턴의 간단한 형식은 이미 출력에 필요한 장치에 대한 정보를 제공하지만 특정 문자열만 추출하기 위해 추가 필터링을 수행할 수도 있습니다.