systemd-tmp 파일은 어떻게 작동합니까?


15

/sys/bus/usb/devices/4-3/power/wakeup부팅 할 때마다 값을 변경하려고합니다 (4-3에 따라 lsusb키보드 ID입니다).

기본값은 다음과 같습니다.

# cat /sys/bus/usb/devices/4-3/power/wakeup
enabled

고전적인 "온라인"편집은 예상대로 작동합니다.

# echo disabled > /sys/bus/usb/devices/4-3/power/wakeup
# cat /sys/bus/usb/devices/4-3/power/wakeup
disabled

systemd 배포판을 사용 하고 있으므로 systemd-way를 사용 하여 "임시 파일"을 편집 하고 싶습니다

다음 파일을 만들었습니다.

# cat /etc/tmpfiles.d/disable-usb-wakeup.conf 
w /sys/bus/usb/devices/4-3/power/wakeup - - - - disabled

그러나 모든 부팅 후에도 여전히이 파일에 기본값이 있습니다 (즉, 활성화 됨)

내가 뭔가 잘못하고 있습니까?

편집하다:

또 다른 테스트 :

# cat /etc/tmpfiles.d/scheduler.conf 
w /sys/block/sda/queue/scheduler - - - - deadline

그리고 이것은 잘 작동합니다! 부팅 후 나는 얻는다 :

# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

(기본은 cfq 스케줄러였습니다)

그렇다면 왜 이것이 작동하고 다른 하나가 작동하지 않습니까?

  • 때문에을 /sys/bus/usb/devices/4-3/power/wakeup에 심볼릭 링크 /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • /sys/bus/usb/devices/4-3/power/wakeup한 단어 만 포함 하기 때문에 ? (즉 공백 없음)

1
좋은 질문이지만 아무도 대답하지 않습니다. 에 상관없이이 있는지 여부 를 잘 할 수있는 것은, 질문은 내가 경우 '접근 방식으로 답을해야 했다 ,이 작업을 수행하는 방법을 것이라고 나는? "사실은이에 대한 답을 필요로하고 실제에 답이. 누구 관리 발견 질문?
Jonathan Komar

답변:


5

나는 tmpfiles.d여기에가는 올바른 방법 이라고 믿지 않습니다 . 정말 udev규칙을 따라야합니다. 보기:

udevadm info -a -p /sys/class/scsi_host/host*

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:11.0/ata1/host0/scsi_host/host0':
    KERNEL=="host0"
    SUBSYSTEM=="scsi_host"
    DRIVER==""
    ATTR{unchecked_isa_dma}=="0"
    ATTR{state}=="running"
    ATTR{cmd_per_lun}=="1"
...
    ATTR{ahci_host_version}=="10200"
    ATTR{prot_guard_type}=="0"
    ATTR{eh_deadline}=="off"
    ATTR{link_power_management_policy}=="max_performance"
    ATTR{host_busy}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:11.0/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
...

그리고 부모 장치 트리를 올라갑니다. 그러나 위의 정보 만 사용하면 다음을 수행 할 수 있습니다.

KERNEL=="host[0-5]", SUBSYSTEM=="scsi_host", ATTR{link_power_management_policy}="min_power"

그리고 나는 그것이 당신의 대본의 대부분을 위해 그것을 믿습니다. 규칙 60 후에 위의 내용을 넣고 싶을 것입니다. 그리고 실제로, 당신은 나머지를 위해 이것을해야합니다- sleep스크립트 의 비트가 충분하기 때문에 경쟁 조건을 암시합니다. udev이 매개 변수를 추가하고 설정하는 매개 변수 sysfs입니다. 이미 수행중인 작업을 수행하도록 요청하십시오.

그리고 키보드의 경우와 똑같이 백라이트를 사용해야합니다. 이 기기에 필요한 정보를 가져 와서 udevadm몇 가지 규칙을 작성하십시오 udevadm test.


에서 wiki.archlinux.org/index.php/... 비슷한 예를있다 ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". 여기 UDEV 규칙에 ACTION 문이없고 쉼표로 구분되지 않은 이유를 설명해 주시겠습니까?
Pro Backup

@ProBackup-아마도 내 문제가 발생했을 수 있습니다. ACTION그래도 비트가 필요 하다고 생각하지 않습니다 .
mikeserv

link_power_management_policy를 테스트하려면 예를 들면 다음과 같습니다.udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

이것은 실제로 올바른 길입니다. 장치 추가 / 제거 이벤트와의 동기화가 필요한 경우 사람들은 실제로 udev 규칙을 사용해야합니다.
intelfx 2016

2

[systemd-tmpfiles가 사용하는 I / O를 스트리밍하고 PROC 또는 SYS로 사용할 수 없습니다 때문에이 될 수 있다고 내 원래 생각은 잘못 . 개행의 중요성에 관한 나의 두 번째 가설도 틀렸다 ...]

방금 살펴 봤는데 /usr/lib/systemd/system/systemd-tmpfiles-setup.service관심이있을만한 몇 가지 비트가 있습니다.

[Unit]
Description=Recreate Volatile Files and Directories
Documentation=man:tmpfiles.d(5)
DefaultDependencies=no
Wants=local-fs.target
After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target
Before=sysinit.target shutdown.target

[...]

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemd-tmpfiles --create --remove

'Wants', 'After'및 'Before'는 언제 이런 일이 발생했는지에 대한 정보를 제공합니다. 이 시점에서 귀하의 장치가 등록 된 것으로 생각되지만 그 이후의 문제 가있을 수 있습니다 sysfs 값을 재설정하는 이 .

이 서비스를 설명하는 실제 명령이기 때문에 가장 유용한 비트는 ExecStart 줄입니다. 이것은 실제로 다음에서 언급됩니다 man systemd-tmpfiles:

예를 들어, 부팅하는 동안 구성 파일에 따라 모든 임시 및 휘발성 디렉토리가 제거되고 작성되도록하기 위해 다음 명령 행이 실행됩니다.

systemd-tmpfiles --remove --create

따라서이를 테스트하려면 sysfs 값을 "enabled"로 설정 한 다음 systemd-tmpfiles --create/etc/tmpfiles.d에서 'w'지시문을 처리 하는 실행을 시도 하십시오. 그것이 작동한다면 (그렇습니다!), systemd-tmpfile 메소드가 훌륭하다는 것을 알고 있습니다. 나중에 부트 프로세스에서 다음을 수행해야합니다.

Requires=multi-user.target
After=multi-user.target

이는 자신의 서비스 파일을 작성하는 것을 의미합니다. 어떤 이유로 든 작동하지 않는 경우 언제든지 스크립트로 수행 할 서비스 파일을 작성할 수 있습니다 echo.


systemd가 가상 파일 시스템에서 쓸 수 없다고 생각합니다. /proc/acpi/wakeup예를 들어 ( wiki.archlinux.org/index.php/Systemd#Temporary_files ) 에서 tmpfile을 사용하는 것이 좋습니다.
eang

@ital : 나는 그것에 대해 틀렸을 수도 있지만, 여전히 좌절한다면 위의 두 번째 가설을 시도하십시오.
goldilocks

echo -n disabled > /sys/...작품을 사용 하므로 아마도이 경우 개행 존재는 신경 쓰지 않을 것입니다. 그러나 tmpfiles 아직도 내가 둘 다 해봤 작동하지 않습니다 disabled\n"disabled\n"
eang

다른 테스트와 가설을 사용하여 첫 번째 게시물을 편집했습니다.
eang

@ital Sheesh. 좋아, 내 세 번째 추측은 운이 좋은 것이므로 위의 내용을 다시 편집했습니다. 그 후 시스템 서비스 작성 및 등록에 대한 기본 사항이 필요한 경우 새로운 질문을하고이 질문을 참조하십시오. 나는이 모든 혼란없이 그것을 설명 할 수 있고, 우리는 다른 사람들로부터 약간의 정보를 얻을 것이며, 그 질문은 후손을 의미 할 수있다.
goldilocks

0

최근에 / sys가 채워지기 전에 /etc/tmpfiles.d가 처리되는 어려운 방법을 배웠으므로 장치가 나타날 때마다 활성화 할 수 있도록 적절한 udev 규칙을 만들어야합니다. 좀 더 융통성있는 질문) / sys에 쓰는 명령으로 스크립트를 실행하는 서비스를 작성하십시오.

https://bbs.archlinux.org/viewtopic.php?id=148170 같은 스크립트를 작성하는 방법에 대한 예를 보려면 여기를 살펴보십시오 .

#### #!/bin/sh

sleep 2

#### # Enforce energy tweaks provided by PowerTop
echo min_power > /sys/class/scsi_host/host0/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host1/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host2/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host3/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host4/link_power_management_policy;
echo min_power > /sys/class/scsi_host/host5/link_power_management_policy;
echo 1 > /sys/module/snd_hda_intel/parameters/power_save;
echo auto > /sys/bus/pci/devices/0000:7f:00.1/power/control;
echo auto > /sys/bus/pci/devices/0000:01:00.1/power/control;

...

echo 4880 > /sys/class/backlight/intel_backlight/brightness

...

tmpfiles 및 / sys / 채우기 순서에 대한 설명을 확인하는 링크를 게시 할 수 있습니까? 여기 tmpfiles가 제안 된 또 다른 아치 스레드 가 있습니다.
mlt

0

이것은 약간 과잉 일 수 있지만 제 경우에는 다른 답변에 언급 된 두 가지 방법이 모두 실패했습니다. 는 tmpfiles.d 전과 변경하게 /sys/항목이 채워집니다udev방법 (가상 네트워크 장치이었다 항목을 찾을 수 없습니다 br0). 따라서 새로운 서비스 파일을 만들었습니다. 새 파일을 만들고 /etc/systemd/system/disable-usb-wakeup.service다음을 내부에 넣으십시오.

[Unit]
Description=Set multicast snoop to off
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "echo disabled >> /sys/bus/usb/devices/4-3/power/wakeup"
RemainAfterExit=true
ExecStop=/usr/bin/bash -c "echo enabled >> /sys/bus/usb/devices/4-3/power/wakeup"
StandardOutput=journal

[Install]
WantedBy=multi-user.target

이제 매번 부팅 할 때마다이 장치가 시작되도록하려면 :

# systemctl enable disable-usb-wakeup.service

그리고 당신은 잘 가야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.