ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle Linux 8 udev
    DB 스터디/Database Documentation 2026. 7. 9. 12:46

    udev 디바이스 매니저

    udev 개요

    udev는 systemd 서비스로 실행되며 커널이 노출하는 시스템 디바이스에 대해 예측 가능하고 관리된 접근을 제공한다. 일반적으로 디바이스 노드의 권한을 관리하고, /dev/ 디렉토리에 심볼릭 링크를 생성하여 디바이스 이름을 예측 가능하게 하며, 네트워크 인터페이스 이름을 변경한다.

     

    동작 방식

    • 부팅 시 디바이스 노드 파일을 동적으로 생성하거나 제거한다.
    • 디바이스 노드를 생성할 때 /sys 디렉토리에서 라벨, 시리얼 번호, 버스 번호 등의 속성을 읽는다.
    • 재부팅 시에도 일관된 이름을 보장하기 위해 Persistent Device Names를 사용한다. 이는 외부 스토리지 장치 사용 시 특히 중요하다.
    • 커널 이벤트를 감지하고 규칙에 따라 특정 동작을 수행한다. 예: USB 저장 장치 연결 시 커널이 udev에 알리고, udev는 핸들러를 호출하여 장치를 마운트한다.

    설정 파일

    • 기본 설정 파일: /etc/udev/udev.conf
    • 로그 우선순위: err, info, debug 중 선택 가능하며 기본값은 err이다.
    • 추가 규칙은 /etc/udev/rules.d/ 내 개별 규칙 파일에서 정의한다.

    디바이스 파일

    /dev 디렉토리

    주변 장치(하드 디스크, 파티션 등)와 가상 장치(난수 발생기 등)에 접근할 수 있는 디바이스 파일을 포함한다. 하위 디렉토리는 특정 장치 유형과 관련된 파일을 포함하며, 대부분 심볼릭 링크로 구현된다.

     

    블록 디바이스 (Block Devices)

    • 데이터에 랜덤 접근 가능
    • 버퍼링을 통해 읽기/쓰기 수행
    • 예: 하드 디스크, CD-ROM, 플래시 메모리

    문자 디바이스 (Character Devices)

    • 데이터 스트리밍 방식으로 1바이트씩 읽기/쓰기
    • 버퍼링이나 랜덤 접근 불가
    • 예: 키보드, 마우스, 터미널, 테이프 드라이브

    의사 터미널 (Pseudo-Terminal Devices)

    • 실제 터미널을 에뮬레이션하여 소프트웨어와 상호작용
    • /dev/pts 디렉토리에 위치
    • 예: /dev/tty1 → /dev/pts/ptmx

    의사 디바이스 (Pseudo Devices)

    • 물리적 하드웨어가 아닌 소프트웨어로 구현된 기능 제공
    • /dev/null: 데이터 싱크, 쓰기 시 데이터가 사라짐
    • /dev/zero: 무한한 0값 바이트 제공
    • /dev/random: 높은 엔트로피 난수 제공, 엔트로피 부족 시 블록됨
    • /dev/urandom: 블록되지 않고 난수 제공, 보안 수준은 낮음

    udevadm을 이용한 udev 조회

    udevadm 명령을 사용하면 udev 데이터베이스를 조회할 수 있다.

    udevadm info --query=all 명령은 디바이스의 모든 정보를 출력하며, 출력값은 접두어(prefix)로 구분된다.

     

    주요 접두어와 의미 

    • P: /sys/ 내 디바이스 경로
    • M: 디바이스 이름 (경로의 마지막 구성 요소)
    • R: 디바이스 번호 (경로 마지막 구성 요소의 숫자 접미사)
    • U: 커널 서브시스템
    • T: 서브시스템 내 커널 디바이스 타입
    • D: 커널 디바이스 노드 major/minor 번호
    • I: 네트워크 인터페이스 인덱스
    • N: 커널 디바이스 노드 이름
    • L: 디바이스 노드 심볼릭 링크 우선순위
    • S: 디바이스 노드 심볼릭 링크
    • Q: 블록 디바이스 시퀀스 번호 (DISKSEQ)
    • V: 연결된 드라이버
    • E: 디바이스 속성

    전체 정보 조회 예시

    /dev/sda의 모든 정보를 조회하려면 다음을 실행한다.

    udevadm info --query=all --name=/dev/sda
    

     

    출력 예시:

    • P: /devices/.../block/sda
    • M: sda
    • U: block
    • T: disk
    • D: b 8:0
    • N: sda
    • S: disk/by-id/...
    • E: DEVNAME=/dev/sda, ID_VENDOR=ORACLE, ID_MODEL=BlockVolume 등

    특정 타입으로 제한하여 조회

    디바이스 경로 조회

    udevadm info --query=path --name=/dev/sda
    

     

    심볼릭 링크 조회

    udevadm info --query=symlink --name=/dev/sda
    

     

    디바이스 속성 조회

    udevadm info --query=property --name=/dev/sda
    

     

    부모 디바이스 속성까지 조회

    --attribute-walk 옵션을 사용하면 해당 디바이스와 부모 디바이스의 속성을 모두 확인할 수 있다.

    udevadm info --attribute-walk --name=/dev/sda
    

    출력은 /sys 경로를 따라 부모 디바이스까지 탐색하며, 각 디바이스의 KERNEL, SUBSYSTEM, DRIVER, ATTR{...} 속성을 보여준다.


    udev 규칙 다루기

    udev는 규칙 파일(rules)을 사용하여 디바이스를 식별하고 이름을 생성한다.

    • 커널이 새로운 디바이스를 발견하거나 기존 디바이스가 오프라인이 되면 uevent 알림을 udev에 전달한다.
    • udev는 메모리에 저장된 규칙을 /sys 디렉토리의 디바이스 속성과 비교하여 해당 디바이스를 식별한다.
    • 규칙 파일은 여러 디렉토리에 존재하지만, 사용자가 편집할 수 있는 파일은 /etc/udev/rules.d/*.rules뿐이다.
    • 규칙은 사전식(lexical) 순서로 처리되며, /etc/udev/rules.d의 규칙은 동일 이름의 다른 위치 규칙을 덮어쓴다.

    규칙 문법 예시

    /lib/udev/rules.d/50-udev-default.rules에서 발췌한 예시:

    SUBSYSTEM=="block", SYMLINK{unique}+="block/%M:%m"  
    KERNEL=="tty[pqrstuvwxyzabcdef][0123456789abcdef]", GROUP="tty", MODE="0660"  
    KERNEL=="null|zero|full|random|urandom", MODE="0666"  
    SUBSYSTEM=="block", GROUP="disk"  
    

     

    연산자 종류

    • = : 값 할당(기존 값 덮어씀)
    • += : 값 추가(리스트에 덧붙임)
    • := : 값 고정(이후 규칙에서 변경 불가)
    • == : 값이 동일한지 비교
    • != : 값이 다른지 비교

    패턴 매칭 문자

    • ? : 단일 문자 매칭
    • * : 0개 이상의 문자 매칭
    • [] : 지정된 문자 집합 또는 범위 매칭 (예: tty[sS][0-9] → ttys7, ttyS7)

    자주 쓰이는 Match Key

    • ACTION : 이벤트 동작(add/remove 등)
    • ENV{key} : 디바이스 속성 값 매칭 (예: ENV{DEVTYPE}=="disk")
    • KERNEL : 디바이스 이름 매칭 (예: KERNEL=="dm-*")
    • NAME : 디바이스 파일 또는 네트워크 인터페이스 이름 매칭
    • SUBSYSTEM : 디바이스가 속한 서브시스템 매칭 (예: SUBSYSTEM=="tty")
    • TEST : 특정 파일/경로 존재 여부 확인

    자주 쓰이는 Assignment Key

    • ENV{key} : 디바이스 속성 값 지정
    • GROUP : 디바이스 파일 그룹 지정 (예: GROUP="disk")
    • MODE : 권한 지정 (예: MODE="0640")
    • NAME : 디바이스 파일 이름 지정
    • OWNER : 소유자 지정
    • RUN : 디바이스 파일 생성 후 실행할 명령 지정
    • SYMLINK : 심볼릭 링크 생성

    문자열 치환

    • $attr{file} : /sys 속성 값
    • $devpath : sysfs 내 디바이스 경로
    • $env{key} : 환경 변수 값
    • $kernel : 커널 디바이스 이름
    • $major, $minor : 디바이스 major/minor 번호
    • $name : 현재 디바이스 파일 이름

    udev 규칙 커스터마이징

    udev 규칙은 디바이스 이벤트 발생 시 적용되며, 규칙 평가 순서가 중요하다. udev는 규칙 파일을 사전식(lexical) 순서로 처리하므로, 커스텀 규칙을 기본 규칙보다 먼저 적용하려면 파일명을 앞쪽에 오도록 설정해야 한다.

     

    커스텀 규칙 작성 절차 예시 (/dev/sdb → /dev/my_disk 심볼릭 링크 생성)

     

    1. 규칙 파일 생성

    /etc/udev/rules.d/10-local.rules 파일을 만든다.

    KERNEL=="sdb", ACTION=="add", SYMLINK="my_disk"
    

     

    2. 규칙 테스트

    udevadm test 명령으로 규칙 적용을 시뮬레이션한다.

    udevadm test /sys/class/block/sdb
     
    출력 예시:
    LINK 'my_disk' /etc/udev/rules.d/10-local.rules:1
    creating symlink '/dev/my_disk' to 'sdb'
    
     

    3. udev 서비스 재시작

    sudo systemctl restart systemd-udevd

     

    4. 규칙 적용 확인

    ls -F /dev/sd* /dev/my_disk

     

    출력 예시:

    /dev/my_disk@  /dev/sda  /dev/sda1  /dev/sda2  /dev/sdb
    

     

    5. 변경 사항 되돌리기 (옵션)

    sudo rm /etc/udev/rules.d/10-local.rules
    sudo rm /dev/my_disk
    sudo systemctl restart systemd-udevd

    (출처: Oracle Linux 8 Managing System Devices With udev)

Designed by Tistory.