내 예제 규칙은 다음과 같습니다.
cat /etc/udev/rules.d/55-battery-charge.rules
ACTION=="add|change", KERNEL=="BAT*", SUBSYSTEM=="power_supply", ATTR{charge_control_end_threshold}="60"
udevadm test /sys/class/power_supply/BAT0
잘 작동합니다:
BAT0: /etc/udev/rules.d/55-battery-charge.rules:1 ATTR '/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:01/PNP0C0A:03/power_supply/BAT0/charge_control_end_threshold' writing '60'
BAT0: /etc/udev/rules.d/55-battery-charge.rules:1 Failed to write ATTR{/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:01/PNP0C0A:03/power_supply/BAT0/charge_control_end_threshold}, ignoring: Permission denied
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:01/PNP0C0A:03/power_supply/BAT0
...
ACTION=add
SUBSYSTEM=power_supply
USEC_INITIALIZED=2126021481
...
실제로 시작되었을 때 udev 디버그 로그에는 BAT0에 대한 트리거 규칙이 표시되지 않았습니다.
journalctl -b 0 -u systemd-udevd | grep BAT0
systemd-udevd[591]: BAT0: Device (SEQNUM=4977, ACTION=add) is queued
systemd-udevd[591]: BAT0: sd-device-monitor: Passed 734 byte to netlink monitor
systemd-udevd[668]: BAT0: Processing device (SEQNUM=4977, ACTION=add)
systemd-udevd[668]: BAT0: Device (SEQNUM=4977, ACTION=add) processed
systemd-udevd[668]: BAT0: sd-device-monitor: Passed 734 byte to netlink monitor
initramfs를 수행했고 부팅 시 규칙이 로드되었습니다.
systemd-udevd[591]: Reading rules file: /etc/udev/rules.d/55-battery-charge.rules
이상한 점은 제거하면 SUBSYSTEM=="power_supply"
중간에 작동한다는 것입니다.
systemd-udevd[589]: BAT0: Device (SEQNUM=4976, ACTION=add) is queued
systemd-udevd[589]: BAT0: sd-device-monitor: Passed 735 byte to netlink monitor
systemd-udevd[667]: BAT0: Processing device (SEQNUM=4976, ACTION=add)
systemd-udevd[667]: BAT0: /etc/udev/rules.d/55-battery-charge.rules:1 ATTR '/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:01/PNP0C0A:03/power_supply/BAT0/charge_control_end_threshold' writing '60'
systemd-udevd[667]: BAT0: /etc/udev/rules.d/55-battery-charge.rules:1 Failed to write ATTR{/sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:01/PNP0C0A:03/power_supply/BAT0/charge_control_end_threshold}, ignoring: No such file or directory
systemd-udevd[667]: BAT0: Device (SEQNUM=4976, ACTION=add) processed
systemd-udevd[667]: BAT0: sd-device-monitor: Passed 735 byte to netlink monitor
BAT0이 추가되었을 때 Charge_control_end_threshold sysfs가 아직 존재하지 않았던 것 같습니다. 임계값 파일이 공개된 경우에만 발생하는지 어떻게 확인합니까?
흠... 이제 이해합니다. 다른 커널 모듈은 실제로 BAT0 이후에 해당 매개변수를 노출합니다.
답변1
BAT0과 같은 장치는 부팅 프로세스 초기에 추가됩니다. 그런 다음 일부 다른 커널 모듈은 다른 파일/속성을 BAT0의 sysfs에 노출할 수 있습니다. 따라서 규칙이 다음을 기반으로 하는 경우 이러한 추가 속성을 설정하는 규칙은 실패할 수 있습니다.ACTION==add