
블록 장치의 변경 작업에 바인딩되고 지정된 스크립트를 실행하는 기존 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
.