Systemd-tmpfiles কীভাবে কাজ করে?


15

আমি /sys/bus/usb/devices/4-3/power/wakeupপ্রতিটি বুটে মানটির পরিবর্তন করার চেষ্টা করছি ( lsusbএটি আমার কীবোর্ডের আইডি অনুসারে 4-3 )।

ডিফল্ট মানটি হ'ল:

# 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

আমি একটি সিস্টেমযুক্ত ডিস্ট্রো ব্যবহার করছি তাই আমি "টেম্প ফাইলগুলি" সম্পাদনা করার জন্য সিস্টেমড-ওয়ে ব্যবহার করতে চাই

আমি নিম্নলিখিত ফাইলটি তৈরি করেছি:

# 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 

(ডিফল্টটি সিএফকিউ শিডিউলার ছিল)

সুতরাং, কেন এটি এক কাজ করে এবং অন্যটি কাজ করে না?

  • কারণ /sys/bus/usb/devices/4-3/power/wakeupএকটি syMLink হয় /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==""
...

এবং এটি চালিত হয়, পিতামাত্ত ডিভাইস ট্রি ধরে walking তবে এটি বিবেচনা করুন, উপরের তথ্যটি ব্যবহার করে আপনি এটি করতে পারেন:

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

এবং আমি বিশ্বাস করি এটি আপনার স্ক্রিপ্টের বেশিরভাগ ক্ষেত্রেই তা করে। আমার মনে হয় আপনি rule০ বিধি নিষেধের পরে উপরের কথাটি রাখতে চান। এবং সত্যই, আপনার বিশ্রামের জন্য এটি করা উচিত - কেবলsleep আপনার স্ক্রিপ্টের সামান্য বিট যথেষ্ট কারণ - এটি রেসের শর্ত বোঝায়। udevএই প্যারামিটারগুলি যুক্ত এবং সেট করা হচ্ছে - এটি এক যা জনবহুল sysfs। এটি ইতিমধ্যে যে কাজটি করছে তা করতে বলুন।

এবং আপনার কীবোর্ডের জন্য অবশ্যই আপনার একই কাজ করা উচিত - এবং ব্যাকলাইট। এই ডিভাইসগুলির জন্য আপনার প্রয়োজনীয় তথ্যগুলি কেবল এগুলি থেকে পান udevadm, কিছু নিয়ম এবং udevadm testসেগুলি লিখুন ।


উইকি.আরচলিনক্স . org / ইন্ডেক্স.এফপি / p তে একই ধরণের উদাহরণ রয়েছে ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"। আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এখানে আপনার ইউডিইভি বিধি একটি অ্যাকশন বিবৃতি অন্তর্ভুক্ত করে না এবং কমা পৃথক করা হয়নি?
প্রো ব্যাকআপ

@ প্রব্যাকআপ - সম্ভবত আমার বিচ্ছেদ হয়েছে। আমি মনে করি না ACTIONযদিও বিটটি প্রয়োজনীয় necessary
মাইকজার্ভ

উদাহরণ হিসাবে লিঙ্ক_পাওয়ার_ম্যানেজমেন্ট_পলিসি পরীক্ষা করতে:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
প্রো ব্যাকআপ

এটি সত্যিই সঠিক পথে। ডিভাইস সংযোজন / অপসারণ ইভেন্টগুলিতে সিঙ্ক্রোনাইজেশন প্রয়োজন এমন ক্ষেত্রে লোকেদের সত্যই ইউদেব বিধিগুলি ব্যবহার করা উচিত।
intelfx

2

[আমার আসল ধারণাটি এটি হতে পারে কারণ systemd-tmpfiles I / O স্ট্রিম ব্যবহার করে এবং প্রোক বা সিস্টেমে ব্যবহার করার উদ্দেশ্যে নয় এটি ভুল । একটি নতুন লাইনের তাৎপর্য সম্পর্কে আমার দ্বিতীয় অনুমানটিও ভুল ছিল ...]

আমি কেবল দেখেছি /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- র মান।

সর্বাধিক সহায়ক বিট হল এক্সকস্টার্ট লাইন, কারণ এটি হ'ল প্রকৃত আদেশ যা এই পরিষেবার জন্য অ্যাকাউন্ট করে। এটি আসলে উল্লেখ করা হয়েছে man systemd-tmpfiles:

উদাহরণস্বরূপ, বুট চলাকালীন সমস্ত অস্থায়ী এবং অস্থায়ী ডিরেক্টরি মুছে ফেলা হয়েছে এবং কনফিগারেশন ফাইল অনুসারে তৈরি করা হয়েছে তা নিশ্চিত করার জন্য নিম্নলিখিত কমান্ড লাইনটি কার্যকর করা হয়:

systemd-tmpfiles - সরানো - তৈরি করুন

সুতরাং, এটি পরীক্ষা করতে, সিসফেস মানটিকে "সক্ষম" হিসাবে সেট করুন এবং তারপরে চালনার চেষ্টা করুন systemd-tmpfiles --createযা আপনার 'ডাব্লু' নির্দেশকে /etc/tmpfiles.d তে প্রসেস করবে। যদি এটি কাজ করে (এটি হওয়া উচিত!), তবে আপনি জানেন যে systemd-tmpfile পদ্ধতিটি ভাল, কেবল আপনাকে বুট প্রক্রিয়াতে পরে এটি করতে হবে, সম্ভবত:

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

যার অর্থ আপনার নিজের পরিষেবা ফাইলটি লেখা; যদি কোনও কারণে এটি কাজ করে না, আপনি স্ক্রিপ্টটি করার জন্য কোনও সার্ভিস ফাইল সর্বদা লিখতে পারেন echo


আমি মনে করি না যে সিস্টেমড ভার্চুয়াল ফাইল সিস্টেমে লিখতে পারে না। /proc/acpi/wakeupজরিমানা কাজ করে tmpfiles ব্যবহার করে , উদাহরণস্বরূপ ( wiki.archlinux.org/index.php/Sstmd#Temporary_files )

@ মূল: আমি সম্ভবত এটি সম্পর্কে ভুল ছিলাম, তবে আপনি যদি এখনও হতাশ হন তবে উপরে আমার দ্বিতীয় অনুমানটি চেষ্টা করুন।
গোল্ডিলকস

echo -n disabled > /sys/...কাজগুলি ব্যবহার করে, সুতরাং সম্ভবত নতুন লাইনের উপস্থিতি এই ক্ষেত্রে যত্ন নেবে না। তবে টেম্পফিলস এখনও কাজ করছে না, আমি উভয়ই চেষ্টা করেছি disabled\nএবং"disabled\n"
ইয়াং

আমি অন্য পোস্ট এবং কিছু অনুমান দিয়ে প্রথম পোস্ট সম্পাদনা করেছি।
ইং

@ শীতল ঠিক আছে, খুব নিশ্চিত যে আমার তৃতীয় অনুমানটি ভাগ্যবান, সুতরাং আমি আবার এটিকে সম্পাদনা করেছি, হ্যাঁ। এর পরে যদি সিস্টেমড সার্ভিস লিখতে এবং নিবন্ধ করার জন্য আপনার বেসিকগুলির প্রয়োজন হয় তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং সম্ভবত এটির রেফারেন্স করুন; আমি এই সমস্ত বিশৃঙ্খলা ছাড়াই এটি ব্যাখ্যা করতে পারি, আমরা অন্যের কাছ থেকে কিছু ইনপুট পাব এবং প্রশ্নটি উত্তরসূরির পক্ষে দাঁড়াতে পারে (আমি এখনও এখানে কোনও দেখতে পাচ্ছি না) এটি খুব ভালভাবে সম্বোধন করেছে)।
সোনারলোকস

0

আমি সম্প্রতি শিখেছি /etc/tmpfiles.d হার্ড পদ্ধতিতে / sys জনবহুল হওয়ার পূর্বে প্রক্রিয়াজাত করা হয় যাতে আপনার যথাযথ 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.