시스템 서비스 실행에 udev 환경 변수 전달

시스템 서비스 실행에 udev 환경 변수 전달

블록 장치의 변경 작업에 바인딩되고 지정된 스크립트를 실행하는 기존 udev 규칙을 마이그레이션하고 있습니다.

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", RUN+="/usr/local/bin/script"

ID_CDROM_MEDIA-0이 구성에서 udev는 및 와 같은 하드웨어 장치와 관련된 환경 변수를 전달했습니다 ID_FS_LABEL. 이후 systemd를 사용하여 하드웨어 변경에 대한 서비스를 시작하도록 udev 규칙을 업데이트했습니다.

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change.service"

시스템 서비스 파일:

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script

[Install]
WantedBy=multi-user.target

이 시점에서 서비스는 변경 이벤트에 대해 실행되지만 udev의 RUN 명령에 의해 전달된 환경 변수는 서비스 실행에 전달되지 않습니다.

udev에서 systemd의 실행 환경으로 환경을 전달할 수 있습니까? 아니면 명시적으로 매개변수를 전달해야 합니까?

답변1

udev에서 systemd로 환경을 전달하는 방법을 찾지 못했지만 환경 속성에 대해 udev 데이터베이스를 쿼리하는 것이 가능합니다. 그만큼udevadm info 명령환경 속성만 쿼리하고 평가할 수 있는 형식으로 인쇄할 수 있는 --query및 매개 변수가 모두 있습니다 .--export

udevadm환경 변수를 초기화하기 위해 systemd 인스턴스 변수와 명령의 조합을 사용했습니다 .

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change@%E{DEVNAME}.service"

이 udev 규칙은 다음 서비스 파일을 실행하고 해당 DEVNAME변수를 서비스와 함께 인스턴스 변수로 전달합니다.

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script %I

[Install]
WantedBy=multi-user.target

이 인스턴스 변수를 사용하여 udev 요소의 환경 속성을 평가하고 문제를 해결했습니다.

#!/bin/sh

# Systemd passes the DEVNAME as the first parameter to the script
eval $(udevadm info --query=env --export $1)

 # The rest of the script that depends on the udev environment
 ...

답변2

위대한 것을 확장하려면답변@벤 캠벨 님..

장치가 udev 규칙을 트리거한 후 udev 환경 데이터베이스에서 속성에 액세스하는 방법은 다음과 같습니다. 예를 들어 USB 드라이브가 방금 연결되었고 해당 레이블을 가져오고 싶다고 가정해 보겠습니다.

systemd 서비스가 실행하는 스크립트에서 해당 eval $(udevadm info --query=env --export $1)줄 뒤에 다음과 같은 내용을 추가합니다.
echo $ID_FS_LABEL >> "/tmp/file.txt"

마찬가지로 등의 값도 얻을 수 ID_PART_ENTRY_UUID있습니다 ID_VENDOR.

관련 정보