웹사이트 검색

Linux에서 장치 감지 및 관리를 위해 Udev를 사용하는 방법


Udev(사용자 공간 /dev)는 커널 버전 2.6 이후 동적 장치 감지 및 관리를 위한 Linux 하위 시스템입니다. 이는 devfshotplug를 대체합니다.

부팅 시 또는 사용자가 시스템에서 장치를 제거하거나 시스템에서 장치를 제거합니다. 그런 다음 장치에 대한 정보나 상태 변경 사항을 사용자 공간에 전파합니다.

그 기능은 1) 시스템 애플리케이션에 장치 이벤트를 제공하고, 2) 장치 노드의 권한을 관리하고, 3) 장치에 액세스하기 위해 /dev 디렉터리에 유용한 심볼릭 링크를 생성하거나 네트워크 인터페이스의 이름을 바꾸는 것입니다. .

udev의 장점 중 하나는 영구 장치 이름을 사용하여 검색 순서에도 불구하고 재부팅 시 일관된 장치 이름 지정을 보장할 수 있다는 것입니다. 이 기능은 커널이 검색 순서에 따라 예측할 수 없는 장치 이름을 할당하기 때문에 유용합니다.

이 글에서는 Linux 시스템에서 기기 감지 및 관리를 위해 Udev를 사용하는 방법을 알아봅니다. 대부분의 주류 최신 Linux 배포판에는 기본 설치의 일부로 Udev가 함께 제공됩니다.

Linux에서 Udev의 기본 사항 알아보기

udev 데몬인 systemd-udevd(또는 systemd-udevd.service)는 커널과 통신하고 기기 uevents 를 수신합니다. 시스템에 장치를 추가하거나 제거할 때마다 또는 장치의 상태가 변경될 때마다 해당 장치에서 직접 가져옵니다.

Udev는 규칙을 기반으로 합니다. 규칙은 유연하고 매우 강력합니다. 수신된 모든 기기 이벤트는 /lib/udev/rules.d/run/udev/rules.d에 있는 파일에서 읽은 규칙 집합과 일치합니다.

/etc/udev/rules.d/ 디렉터리(파일은 .rules 확장자로 끝나야 함)에 맞춤 규칙 파일을 작성하여 기기를 처리할 수 있습니다. 이 디렉터리의 규칙 파일은 우선순위가 가장 높습니다.

장치 노드 파일을 생성하려면 udev레이블, 일련 번호, 사용된 메이저 및 마이너 번호, 버스 장치 번호 등과 같은 특정 속성을 사용하여 장치를 식별해야 합니다. 훨씬 더. 이 정보는 sysfs 파일 시스템에서 내보내집니다.

장치를 시스템에 연결할 때마다 커널은 이를 감지하고 초기화하며, 장치 속성을 저장하는 /sys/ 디렉터리 아래에 장치 이름을 가진 디렉터리가 생성됩니다.

udev의 기본 구성 파일은 /etc/udev/udev.conf이며, udev 데몬의 런타임 동작을 제어하려면 udevadm 유틸리티를 사용할 수 있습니다.

수신된 커널 이벤트(uevents) 및 udev 이벤트(udev가 규칙 처리 후 전송)를 표시하려면 udevadm을 실행하세요. > 모니터 명령으로. 그런 다음 장치를 시스템에 연결하고 터미널에서 장치 이벤트가 처리되는 방식을 살펴보세요.

다음 스크린샷은 USB 플래시 디스크를 테스트 시스템에 연결한 후 ADD 이벤트의 일부를 보여줍니다.

udevadm monitor 

USB 디스크에 할당된 이름을 찾으려면 sysfs 파일 시스템과 udev db를 읽어 처리된 장치에 대한 정보를 수집하는 lsblk 유틸리티를 사용하세요.

 
lsblk

이전 명령의 출력에서 USB 디스크 이름은 sdb1로 지정됩니다(절대 경로는 /dev/sdb1여야 함). udev 데이터베이스에서 장치 속성을 쿼리하려면 info 명령을 사용하세요.

udevadm info /dev/sdb1

Linux에서 Udev 규칙을 사용하는 방법

이 섹션에서는 udev 규칙을 작성하는 방법을 간략하게 설명합니다. 규칙은 하나 이상의 키-값 쌍이 쉼표로 구분된 목록으로 구성됩니다. 규칙을 사용하면 기본 이름에서 장치 노드의 이름을 바꾸고, 장치 노드의 권한과 소유권을 수정하고, 장치 노드가 생성되거나 삭제될 때 프로그램이나 스크립트의 실행을 트리거할 수 있습니다.

USB 장치가 추가될 때와 실행 중인 시스템에서 제거될 때 스크립트를 시작하는 간단한 규칙을 작성하겠습니다.

두 개의 스크립트를 만드는 것부터 시작해 보겠습니다.

sudo vim /bin/device_added.sh

device_add.sh 스크립트에 다음 줄을 추가합니다.

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

두 번째 스크립트를 엽니다.

sudo vim /bin/device_removed.sh

그런 다음 device_removed.sh 스크립트에 다음 줄을 추가하세요.

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

파일을 저장하고 닫은 후 두 스크립트를 모두 실행 가능하게 만듭니다.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

다음으로, /etc/udev/rules.d/80-test.rules라는 위 스크립트의 실행을 트리거하는 규칙을 만들어 보겠습니다.

vim /etc/udev/rules.d/80-test.rules

다음 두 가지 규칙을 추가하세요.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

어디 :

  • "==": 동등성을 비교하는 연산자입니다.
  • "+=": 항목 목록을 보유하는 키에 값을 추가하는 연산자입니다.
  • SUBSYSTEM: 이벤트 장치의 하위 시스템과 일치합니다.
  • ACTION: 이벤트 작업의 이름과 일치합니다.
  • ENV{DEVTYPE}: 기기 속성 값, 이 경우 기기 유형과 일치합니다.
  • RUN: 이벤트 처리의 일부로 실행할 프로그램이나 스크립트를 지정합니다.

파일을 저장하고 닫습니다. 그런 다음 루트로서 다음을 실행하여 systemd-udevd에 규칙 파일을 다시 로드하도록 지시합니다(이는 커널 모듈 인덱스와 같은 다른 데이터베이스도 다시 로드합니다).

sudo udevadm control --reload

이제 USB 드라이브를 컴퓨터에 연결하고 device_add.sh 스크립트가 실행되었는지 확인하세요. 먼저 /tmp 아래에 scripts.log 파일을 생성해야 합니다.

ls -l /tmp/scripts.log

그런 다음 스크린샷에 표시된 것처럼 파일에는 '날짜_시간에 USB 장치 제거됨'과 같은 항목이 있어야 합니다.

cat /tmp/scripts.log

udev 규칙을 작성하고 udev를 관리하는 방법에 대한 자세한 내용은 다음을 실행하여 각각 udevudevadm 수동 항목을 참조하세요.

man udev
man udevadm
요약

Udev/dev 디렉터리에서 장치 노드를 동적으로 설정하는 방법을 제공하는 뛰어난 장치 관리자입니다. 장치를 연결하고 검색하는 즉시 장치가 구성되도록 합니다. 처리된 장치에 대한 정보나 상태 변경 사항을 사용자 공간에 전파합니다.

이 주제에 관해 질문이나 공유할 생각이 있으면 피드백 양식을 사용하세요.