Systemd-tmpfiles nasıl çalışır?


15

/sys/bus/usb/devices/4-3/power/wakeupHer önyüklemenin değerini değiştirmeye çalışıyorum (4-3'e göre lsusb, klavye kimliği).

Varsayılan değer:

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

Klasik "çevrimiçi" düzenleme beklendiği gibi çalışır:

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

Ben "temp dosyalarını" düzenlemek için systemd-yolu kullanmak istiyorum bir systemd dağıtım kullanıyorum

Aşağıdaki dosyayı oluşturdum:

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

ancak her önyüklemeden sonra hala bu dosyada varsayılan değer var (etkin)

Yanlış bir şey mi yapıyorum?

DÜZENLE:

İşte başka bir test:

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

ve bu iyi çalışıyor! Önyükleme yaptıktan sonra:

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

(varsayılan seçenek cfq zamanlayıcıydı)

Peki, bu neden çalışıyor, diğeri çalışmıyor?

  • Çünkü /sys/bus/usb/devices/4-3/power/wakeupbir sembolik bağlantı /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/nedir?
  • Çünkü /sys/bus/usb/devices/4-3/power/wakeupsadece bir kelime var mı? (yani boşluk yok)

1
Harika bir soru, ama kimse cevap vermiyor. Ne olursa olsun olup olmadığının doğru ben eğer yapılacak şey, sorular', yaklaşımıyla cevap verilmelidir were bunu nasıl olur ben?" Aslında bunun cevabını gerekli ve gerçek üzerine cevap bu. Herkes bakımı bulundu soru?
Jonathan Komar

Yanıtlar:


5

Buraya tmpfiles.dgitmenin doğru yolu olduğuna inanmıyorum . udevKuralları gerçekten yapmalısınız . Bak:

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==""
...

Üst cihaz ağacına doğru yürür. Ancak, sadece yukarıdaki bilgileri kullanarak şunları yapabileceğinizi düşünün:

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

Ve bence bunu senaryonuzun çoğunluğu için yapıyor. Yukarıdaki kural 60'dan sonra koymak isteyeceksiniz. Ve gerçekten, bunu geri kalanı için yapmalısınız - sleepbetiğinizdeki bit yeterli bir nedendir - bir yarış durumu anlamına gelir. udevbu parametreleri ekleyen ve ayarlayan - bu dolduran olandır sysfs. Sadece yaptığı işi yapmasını isteyin.

Ve klavyeniz için kesinlikle aynı şeyi ve arka ışığı yapmalısınız. Bu cihazlar hakkında ihtiyacınız olan bilgileriudevadm , bazı kurallar yazın ve udevadm testbunları yazın.


At wiki.archlinux.org/index.php/... benzer bir örnek vardır ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". Buradaki UDEV kuralınızın neden bir ACTION deyimi içermediğini ve virgülle ayrılmadığını açıklar mısınız?
Pro Backup

@ProBackup - muhtemelen benim bozuk. ACTIONYine de biraz gerekli olduğunu sanmıyorum .
mikeserv

Örneğin link_power_management_policy'yi test etmek için:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Pro Backup

Bu gerçekten doğru yol. Kullanıcılar, cihaz ekleme / kaldırma olaylarıyla senkronizasyonun gerekli olduğu durumlarda gerçekten udev kurallarını kullanmalıdır.
intelfx

2

[Systemd-TMPFILES kullanımları I / O dinleme ve proc veya sys kullanılmak üzere tasarlanmıştır edilmemesi nedeniyle bu olabileceğini Benim orijinal fikir yanlış . Bir satırsonunun önemi ile ilgili 2. hipotezim de yanlıştı ...]

Sadece baktım /usr/lib/systemd/system/systemd-tmpfiles-setup.service ve orada ilgi çekici olabilecek birkaç parça var:

[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

'İstiyor', 'Sonra' ve 'Önce' bunun ne zaman gerçekleştiği hakkında bilgi verir; Cihazınızın bu noktaya göre kaydedildiğini düşünürdüm, ancak daha sonra sysfs değerini sıfırlayan bir şey olabilir .

En yararlı bit ExecStart satırıdır, çünkü bu servisi açıklayan gerçek komut budur. Bu aslındaman systemd-tmpfiles :

Örneğin, önyükleme sırasında tüm geçici ve geçici dizinlerin yapılandırma dosyasına göre kaldırıldığından ve oluşturulduğundan emin olmak için aşağıdaki komut satırı yürütülür:

systemd-tmpfiles --remove --create

Bu nedenle, bunu sınamak için, sysfs değerini "etkin" olarak ayarlayın ve ardından systemd-tmpfiles --create/etc/tmpfiles.d dosyasında 'w' yönergesinizi işleyecek şekilde çalıştırmayı deneyin . Bu işe yararsa (gerekir!), O zaman systemd-tmpfile yönteminin iyi olduğunu bilirsiniz, sadece daha sonra önyükleme işleminde yapmanız gerekir, belki de:

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

Bu da kendi servis dosyanızı yazmak anlamına gelir; herhangi bir nedenle çalışmazsa, komut dosyasının çalışması için her zaman bir hizmet dosyası yazabilirsiniz echo.


Systemd'in sanal dosya sistemlerine yazamayacağını sanmıyorum. Üzerinde TMPFILES kullanma /proc/acpi/wakeupçalışmaları ince, örneğin ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
Eang

@ital: Muhtemelen bu konuda yanılmışım, ama eğer hala hayal kırıklığına uğramışsan yukarıdaki ikinci hipotezimi dene.
goldilocks

echo -n disabled > /sys/...Çalışmaları kullanmak , bu nedenle muhtemelen yeni satırın varlığı bu durumda umursamıyor. Ama TMPFILES hala ben hem denedim çalışmıyor disabled\nve"disabled\n"
Eang

İlk yazıyı başka bir test ve bazı hipotezlerle düzenledim.
Eang

@ital Sheesh. Tamam, benim 3. tahminim şanslı olandan eminim, bu yüzden yukarıda tekrar düzenledim, lol. Bundan sonra bir systemd hizmetini yazmak ve kaydetmek için temel bilgilere ihtiyacınız varsa, yeni bir soru sorun ve belki de buna başvurun; Tüm bu karmaşa olmadan açıklayabilirim, başkalarından bazı girdiler alacağız ve soru gelecek kuşaklara dayanabilir (henüz bunu çok iyi ele alan hiçbir şey göremiyorum).
goldilocks

0

Son zamanlarda /etc/tmpfiles.d / sys doldurulmadan önce işlenmesinin zor yolunu öğrendim, böylece uygun udev kurallarını oluşturmanız gerekir, böylece aygıtlar ortaya çıktığında veya ... bana sor, daha esnek bir tane) ve / sys içine yazma komutları ile bir komut dosyası çalıştıran bir hizmet oluşturun.

Böyle bir komut dosyasının nasıl oluşturulacağına dair bir örnek için buraya bakın, https://bbs.archlinux.org/viewtopic.php?id=148170 gibi bir şeyle doldurabilirsiniz:

#### #!/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 / nüfus emri ile ilgili beyanınızı onaylayan bir bağlantı gönderebilir misiniz? İşte tmpfiles önerilen başka bir Arch iş parçacığı .
mlt

0

Bu biraz abartılı olabilir, ancak benim durumumda diğer cevaplarda belirtilen her iki yöntem de başarısız oldu. tmpfiles.d Önce değişiklikler yapar /sys/girdileri doldurulur ve udevyöntemi (sanal ağ aygıtı oldu girişini bulamadık br0). Bu nedenle, yeni bir hizmet dosyası oluşturdum. Sadece yeni bir dosya oluşturun /etc/systemd/system/disable-usb-wakeup.serviceve aşağıdakileri içine yerleştirin:

[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

Şimdi, bu ünitenin her önyükleme sorununda başlatıldığından emin olmak için:

# systemctl enable disable-usb-wakeup.service

Ve gitmek için iyi olmalısın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.