Udev는 커널 버전 2.6부터 도입된 동적 디바이스 장치 관리 시스템으로 Linux에서 디바이스 노드 파일을 동적으로 생성하고 제거하는 역할을 합니다.
디바이스 노드는 /dev 디렉토리 하위에 파일 형태로 나타나며, 파일 시스템에 일반 파일인 것처럼 나타나는 디바이스 드라이버에 대한 인터페이스입니다. 이를 통해 디바이스 드라이버와 User Space 간의 인터페이스 역할을 합니다.
udev User Space에서 작동하는 데몬입니다.Kernel 공간과 User 공간으로 나뉘며 Kernel Space은 운영 체제의 핵심 부분으로 하드웨어 자원과 시스템 리소스를 관리하는 공간, User Space은 응용 프로그램이 실행되는 공간입니다.systemd-udevd 라는 udev 데몬을 사용하여 커널과 통신하며, 시스템에 디바이스를 추가, 제거와 같이 상태가 변경될 때마다 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/ : 사용자가 정의한 커스텀 규칙 파일/lib/udev/rules.d/ 에 있고 eth1의 이름을 ens6을 변경하는 규칙이 /run/udev/rules.d/ 있는 경우 최종적으로 인터페이스 이름은 ens6으로 설정됩니다./lib/udev/rules.d//run/udev/rules.d//etc/udev/rules.d/Udev는 디바이스 노드 파일을 생성할 때, sysfs 파일 시스템을 통해 내보내진 디바이스의 특정 속성(예: Serial Number, Device Label, Vender Info, Drivder Name 등)을 사용하여 디바이스를 식별하여 이를 바탕으로 Udev는 적절한 디바이스 노드 파일을 생성합니다.
sysfs File System은 Linux Kernel이 디바이스와 관련된 다양한 속성 및 정보를 사용자 공간에 접근할 수 있도록 /sys/ 라는 디렉토리를 제공하며 커널은 디바이스가 시스템에 연결되면, 해당 디바이스를 감지하고 초기화 후 /sys/ 아래에 디바이스 이름의 디렉토리를 생성합니다. 해당 디렉토리에는 디바이스의 특정 속성이 포함되어 있습니다./sys/ 디렉토리 하위에 디바이 관련 정보를 포함한 새로운 디렉토리를 생성하며, 디바이스 속성을 sysfs 파일 시스템을 통해 내보냅니다. Udev는 커널로 부터 uevent를 수신하고, sysfs(/sys/ 디렉토리 하위)에서 디바이스 정보를 읽어 규칙에 일치하는 적절한 액션을 수행합니다.Udev 구성 파일은 /etc/udev/udev.conf 를 사용하며 Udev 데몬의 기본적인 동작 방식을 설정할 수 있습니다. 일반적으로 Udev의 로깅 레벨, 데이터베이스 위치 등 글로벌 설정이 포함됩니다.
Udev 데몬의 동작을 제어하고 관련 작업을 수행하기 위해서 udevadm 도구를 제공합니다. udevadm 는 CLI 도구로 발생한 이벤트를 모니터링하거나, 특정 디바이스에 대한 정보를 조회 등 다양한 작업을 수행할 수 있습니다.
1. 이벤트를 모니터링하는 명령어를 입력
udevadm monitor
출력
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
2. Network Interface 연결후 이벤트를 확인
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)