udev

더쿠·2024년 10월 25일

설명

  • Udev는 커널 버전 2.6부터 도입된 동적 디바이스 장치 관리 시스템으로 Linux에서 디바이스 노드 파일을 동적으로 생성하고 제거하는 역할을 합니다.

    • 커널 버전 2.6은 2003에 발표되었으며, 현재 리눅스 시스템의 커널 버전이 5~6 사이므로 Udev는 오래된 시스템입니다.
  • 디바이스 노드는 /dev 디렉토리 하위에 파일 형태로 나타나며, 파일 시스템에 일반 파일인 것처럼 나타나는 디바이스 드라이버에 대한 인터페이스입니다. 이를 통해 디바이스 드라이버와 User Space 간의 인터페이스 역할을 합니다.

    • udev User Space에서 작동하는 데몬입니다.
    • 리눅스 시스템은 크게 Kernel 공간과 User 공간으로 나뉘며 Kernel Space은 운영 체제의 핵심 부분으로 하드웨어 자원과 시스템 리소스를 관리하는 공간, User Space은 응용 프로그램이 실행되는 공간입니다.
  • systemd-udevd 라는 udev 데몬을 사용하여 커널과 통신하며, 시스템에 디바이스를 추가, 제거와 같이 상태가 변경될 때마다 uevent 를 수신하고 이를 미리 정의된 규칙에 의해 처리합니다.

    • 예를 들어 USB를 연결하며, Kernel은 새로운 디바이스를 감지하고 uevent를 발생시킵니다. systemd-udevd 는 이를 수신하여 /dev/sda1 과 같은 디바이스 노드 파일을 생성하고, 그것에 관련된 심볼릭 링크나 권한 설정을 수행하거나 NIC(Network Interface Card)가 연결되면 Kernel은 새로운 디바이스를 감지하고 uevent를 발생시킵니다. systemd-udevd 는 이를 수신하여 네트워크 인터페이스에 대해 미리 정의된 규칙을 적용할 수 있습니다.
  • Udev는 규칙을 기반으로 동작하며, 수신된 모든 디바이스 이벤트는 Udev 규칙 파일의 정의된 규칙들과 일치하는지 확인합니다.

    • 하나의 디바이스 이벤트에 대해서 정해진 순서대로 규칙 파일을 읽다가 우선적으로 일치하는 규칙에 대해서만 액션을 수행하며, 뒤에 일치하는 규칙이 있더라도 수행하지 않습니다.
    • 규칙 파일의 정의된 디렉토리 목록으로 해당 경로에 정의된 규칙 파일을 읽습니다. 또한 일반적으로 경로마다 각각의 용도가 있습니다.
      - /lib/udev/rules.d/ : 시스템이 기본으로 제공하는 규칙 파일
      - /run/udev/rules.d/ : 주로 부팅 과정에서 생성된 규칙 파일
      - /etc/udev/rules.d/ : 사용자가 정의한 커스텀 규칙 파일

    • Udev는 디바이스 이벤트(uevents)를 수신하며 아래와 같은 순서로 규칙 파일을 읽습니다.
      예를 들어 eth1의 이름을 ens5로 변경하는 규칙이 /lib/udev/rules.d/ 에 있고 eth1의 이름을 ens6을 변경하는 규칙이 /run/udev/rules.d/ 있는 경우 최종적으로 인터페이스 이름은 ens6으로 설정됩니다.
      1. /lib/udev/rules.d/
      2. /run/udev/rules.d/
      3. /etc/udev/rules.d/

    • 각 경로애 저장되는 규칙 파일도 파일 이름의 접두사(예: (예: 10-, 99-)를 기준으로 읽는 순서가 정해집니다. 오름 차순(1 → 2 → 3)으로 파일을 읽습니다.

    • 다양한 디바이스 속성(예: Device ID, Driver 등.)이 일치하는 규칙을 규칙 파일에서 찾으면, 해당 규칙에 따라서 디바이스 노드 파일을 생성, 권한 설정, 심볼릭 링크 생성 등의 작업을 수행할 수 있습니다.
  • Udev는 디바이스 노드 파일을 생성할 때, sysfs 파일 시스템을 통해 내보내진 디바이스의 특정 속성(예: Serial Number, Device Label, Vender Info, Drivder Name 등)을 사용하여 디바이스를 식별하여 이를 바탕으로 Udev는 적절한 디바이스 노드 파일을 생성합니다.

    • sysfs File System은 Linux Kernel이 디바이스와 관련된 다양한 속성 및 정보를 사용자 공간에 접근할 수 있도록 /sys/ 라는 디렉토리를 제공하며 커널은 디바이스가 시스템에 연결되면, 해당 디바이스를 감지하고 초기화 후 /sys/ 아래에 디바이스 이름의 디렉토리를 생성합니다. 해당 디렉토리에는 디바이스의 특정 속성이 포함되어 있습니다.

    • 디바이스가 시스템에 연결되면 Kernel은 이를 감지하고 uevnet를 발생키시고, 이와 동시에 Kernel은 /sys/ 디렉토리 하위에 디바이 관련 정보를 포함한 새로운 디렉토리를 생성하며, 디바이스 속성을 sysfs 파일 시스템을 통해 내보냅니다. Udev는 커널로 부터 uevent를 수신하고, sysfs(/sys/ 디렉토리 하위)에서 디바이스 정보를 읽어 규칙에 일치하는 적절한 액션을 수행합니다.
  • Udev 구성 파일은 /etc/udev/udev.conf 를 사용하며 Udev 데몬의 기본적인 동작 방식을 설정할 수 있습니다. 일반적으로 Udev의 로깅 레벨, 데이터베이스 위치 등 글로벌 설정이 포함됩니다.

  • Udev 데몬의 동작을 제어하고 관련 작업을 수행하기 위해서 udevadm 도구를 제공합니다. udevadm 는 CLI 도구로 발생한 이벤트를 모니터링하거나, 특정 디바이스에 대한 정보를 조회 등 다양한 작업을 수행할 수 있습니다.



Network Interface를 연결 시 Udev와 Kernel에서 발생하는 디바이스 이벤트(uenvet)를 실시간으로 모니터링

1. 이벤트를 모니터링하는 명령어를 입력

udevadm monitor
  • 실제 uenvet가 발생하지 않기 때문에 별다른 내용이 보이지 않습니다.

출력

monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent



2. Network Interface 연결후 이벤트를 확인

  • 출력에 uenvet가 캡쳐된 것을 확인할 수 있습니다.
  • 출력된 값을 대충 보면 eth0라는 인터페이스 이름을 할당받았지만, ens6로 변경된 것을 볼 수 있습니다. 이는 리눅스 시스템의 예측 가능한 네트워크 인터페이스 규칙을 사용하고 있는 것으로 보입니다.
KERNEL[65770.993729] add      /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:08/wakeup/wakeup11 (wakeup)
KERNEL[65770.993786] add      /devices/pci0000:00/0000:00:06.0 (pci)
UDEV  [65771.000703] add      /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A03:00/device:08/wakeup/wakeup11 (wakeup)
UDEV  [65771.002124] add      /devices/pci0000:00/0000:00:06.0 (pci)
KERNEL[65771.092047] add      /devices/pci0000:00/0000:00:06.0/net/eth0 (net)
KERNEL[65771.092080] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/rx-0 (queues)
KERNEL[65771.092094] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/rx-1 (queues)
KERNEL[65771.092105] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/tx-0 (queues)
KERNEL[65771.092117] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/tx-1 (queues)
KERNEL[65771.093135] bind     /devices/pci0000:00/0000:00:06.0 (pci)
KERNEL[65771.140755] move     /devices/pci0000:00/0000:00:06.0/net/ens6 (net)
UDEV  [65771.705007] add      /devices/pci0000:00/0000:00:06.0/net/ens6 (net)
UDEV  [65771.719434] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/rx-1 (queues)
UDEV  [65771.719508] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/rx-0 (queues)
UDEV  [65771.721023] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/tx-1 (queues)
UDEV  [65771.721055] add      /devices/pci0000:00/0000:00:06.0/net/eth0/queues/tx-0 (queues)
UDEV  [65771.723224] bind     /devices/pci0000:00/0000:00:06.0 (pci)
UDEV  [65771.728290] move     /devices/pci0000:00/0000:00:06.0/net/ens6 (net)
profile
궁금한게 많은 사람

0개의 댓글