메이저/마이너 번호 쌍으로 장치 노드 가져오기

메이저/마이너 번호 쌍으로 장치 노드 가져오기

아래의 각 장치 노드 /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옵션은 --rooted 경로를 지정합니다. 이 옵션이 없으면 위의 결과는 읽기 전용이 됩니다 console. 이 옵션은 여기서 피연산자를 허용하는 -q데이터베이스를 지정합니다 . 왜냐하면 우리가 원하기 때문입니다 .--querynameDEVNAME

메이저:마이너 숫자만 주어진 경우 문자 및/또는 블록 장치에 대한 경로를 찾는 매우 간단한 방법은 다음과 같습니다.

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

udevmikeserv가 보여주는 것처럼 데이터베이스에서 이 정보를 얻을 수도 있습니다 .

답변4

/procLinux에서는 가상 파일 시스템의 특정 파일을 활용할 수 있습니다 .

$ 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

이 패턴의 간단한 형식은 이미 출력에 필요한 장치에 대한 정보를 제공하지만 특정 문자열만 추출하기 위해 추가 필터링을 수행할 수도 있습니다.

관련 정보