कैसे काम करता है systemd-tmpfiles?


15

मैं /sys/bus/usb/devices/4-3/power/wakeupहर बूट पर मूल्य बदलने की कोशिश कर रहा हूं (मेरे अनुसार 4-3 lsusb, यह कीबोर्ड आईडी है)।

डिफ़ॉल्ट मान है:

# 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 डिस्ट्रो का उपयोग कर रहा हूँ, इसलिए मैं "temp files" को संपादित करने के लिए 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
महान सवाल है, लेकिन कोई भी इसका जवाब नहीं दे रहा है। चाहे वह है की परवाह किए बिना सही करने के लिए बात है, सवाल है, दृष्टिकोण के साथ उत्तर दिया जाना चाहिए 'अगर मैं थे यह करने के लिए, कैसे हैं मैं? "मैं वास्तव में इसका जवाब की जरूरत है और वास्तविक पर जवाब देने के लिए इस। किसी को ध्यान पाया प्रश्न?
जोनाथन कोमार

जवाबों:


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 स्टेटमेंट शामिल क्यों नहीं है और अल्पविराम अलग नहीं किया गया है?
प्रो बैकअप

@ProBackup - शायद कारण मेरा टूट गया है। मुझे नहीं लगता कि ACTIONबिट आवश्यक है, हालांकि।
mikeserv

उदाहरण के लिए link_power_management_policy का परीक्षण करने के लिए:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
प्रो बैकअप

यह वास्तव में जाने का उचित तरीका है। लोगों को वास्तव में ऐसे मामलों में udev नियमों का उपयोग करना चाहिए जहां डिवाइस जोड़ / हटाने की घटनाओं के लिए सिंक्रनाइज़ेशन की आवश्यकता होती है।
intelfx

2

[मेरा मूल विचार है कि ऐसा इसलिए हो सकता है क्योंकि systemd-tmpfiles धारा I / O का उपयोग करता है और इसका उद्देश्य खरीद या 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

'वॉन्ट्स', 'आफ्टर' और 'बिफोर' ऐसा होने पर कुछ जानकारी देते हैं; मुझे लगता है कि आपका डिवाइस इस बिंदु से पंजीकृत है, लेकिन बाद में कुछ हो सकता है जो sysfs मूल्य को रीसेट करता है।

सबसे सहायक बिट ExecStart लाइन है, क्योंकि यह वास्तविक कमांड है जो इस सेवा के लिए जिम्मेदार है। यह वास्तव में उल्लेख किया गया है man systemd-tmpfiles:

उदाहरण के लिए, बूट के दौरान निम्न कमांड लाइन को यह सुनिश्चित करने के लिए निष्पादित किया जाता है कि सभी अस्थायी और वाष्पशील निर्देशिकाओं को कॉन्फ़िगरेशन फ़ाइल के अनुसार हटा दिया और बनाया गया है:

systemd-tmpfiles --remove - क्रिएट करें

तो, इसे जांचने के लिए, sysfs मान को "सक्षम" पर सेट करें और फिर चलाने का प्रयास करें systemd-tmpfiles --createजो /etc/tmpfiles.d में आपके 'w' निर्देश को संसाधित करेगा। यदि वह काम करता है (यह चाहिए!), तो आप जानते हैं कि systemd-tmpfile विधि ठीक है, बस आपको इसे बाद में बूट प्रक्रिया में करना होगा, शायद इसके साथ:

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

जिसका अर्थ है अपनी स्वयं की सेवा फ़ाइल लिखना; अगर किसी कारण से यह काम नहीं करता है, तो आप इसे करने के लिए स्क्रिप्ट के लिए हमेशा एक सेवा फ़ाइल लिख सकते हैं echo


मुझे नहीं लगता कि systemd वर्चुअल फ़ाइल सिस्टम पर लिख नहीं सकता है। /proc/acpi/wakeupउदाहरण के लिए, ठीक काम करता है पर tmpfiles का उपयोग करना ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
eang

@ शीत: मैं शायद उस बारे में गलत था, लेकिन अगर आप अभी भी निराश हैं तो ऊपर मेरी दूसरी परिकल्पना को आजमाएं।
गोल्डीलॉक्स

echo -n disabled > /sys/...कार्यों का उपयोग करना , इसलिए शायद इस मामले में न्यूलाइन उपस्थिति का ध्यान नहीं है। लेकिन tmpfiles अभी भी काम नहीं कर रहा है, मैं कोशिश की है दोनों disabled\nऔर"disabled\n"
Eang

मैंने पहले पोस्ट को दूसरे परीक्षण और कुछ परिकल्पना के साथ संपादित किया है।
gगं

@ शीतल शीश। ठीक है, बहुत यकीन है कि मेरा 3 अनुमान भाग्यशाली है, इसलिए मैंने संपादित किया कि ऊपर फिर से, योग्य। अगर इसके बाद आपको सिस्टमड सर्विस लिखने और रजिस्टर करने के लिए मूल बातें चाहिए, तो एक नया सवाल पूछें और शायद इसे देखें; मैं इसे इस अव्यवस्था के बिना समझा सकता हूं, हम दूसरों से कुछ इनपुट प्राप्त करेंगे, और प्रश्न उत्तर के लिए खड़ा हो सकता है (मुझे यहां कोई भी नहीं दिखता है जो इसे बहुत अच्छी तरह से संबोधित करते हैं)।
गोल्डीलॉक्स

0

मुझे हाल ही में पता चला है कि /etc/tmpfiles.d को हार्ड / पॉप से ​​पहले संसाधित करने का कठिन तरीका है ताकि आपको उचित udv नियम बनाने पड़ें ताकि वे सक्षम हों जब भी उपकरण दिखाई दें या ... गंदे तरीके से जाएं (लेकिन यदि आप मुझसे पूछें, एक और अधिक लचीली) और एक ऐसी सेवा बनाएं जो स्क्रिप्ट को / 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 का सुझाव दिया गया था।
मिली

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

और आपको जाना अच्छा होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.