Làm thế nào để systemd-tmpfiles hoạt động?


15

Tôi đang cố gắng thay đổi giá trị của /sys/bus/usb/devices/4-3/power/wakeupmỗi lần khởi động (4-3 theo tôi lsusb, đó là ID bàn phím).

Giá trị mặc định là:

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

Chỉnh sửa "trực tuyến" cổ điển hoạt động như mong đợi:

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

Tôi đang sử dụng một bản phân phối systemd vì vậy tôi muốn sử dụng cách systemd để chỉnh sửa "tệp tạm thời"

Tôi đã tạo tập tin sau:

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

nhưng sau mỗi lần khởi động tôi vẫn có giá trị mặc định trong tệp này (tức là đã bật)

Tôi có làm điều gì sai?

BIÊN TẬP:

Đây là một bài kiểm tra khác:

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

và cái này hoạt động tốt! Sau khi khởi động tôi nhận được:

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

(cái mặc định là bộ lập lịch cfq)

Vì vậy, tại sao cái này hoạt động và cái kia không?

  • Bởi vì /sys/bus/usb/devices/4-3/power/wakeuplà một liên kết đến /sys/devices/pci0000:00/0000:00:12.1/usb4/4-3/?
  • /sys/bus/usb/devices/4-3/power/wakeupchỉ chứa một từ? (tức là không có dấu cách)

1
Câu hỏi tuyệt vời, nhưng không ai trả lời nó. Bất kể cho dù đó là đúng việc cần làm, những câu hỏi cần được trả lời với phương pháp này, 'nếu tôi để làm điều này, làm thế nào sẽ ?" Tôi thực sự cần thiết câu trả lời cho điều này và thấy điều này chăm sóc Bất kỳ ai. Để câu trả lời trên thực tế câu hỏi?
Jonathan Komar

Câu trả lời:


5

Tôi không tin tmpfiles.dlà cách thích hợp để đến đây. Bạn thực sự nên làm các udevquy tắc. Nhìn:

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

Và nó tiếp tục, đi lên cây thiết bị mẹ. Nhưng hãy xem xét rằng, chỉ sử dụng thông tin trên, bạn có thể làm:

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

Và tôi tin rằng nó làm điều đó cho phần lớn kịch bản của bạn. Tôi sẽ muốn đặt ở trên sau quy tắc 60, tôi nghĩ. Và thực sự, bạn nên làm điều này cho phần còn lại - chỉ một sleepchút trong kịch bản của bạn là đủ lý do - nó ngụ ý một điều kiện chủng tộc. udevlà một bổ sung và thiết lập các tham số này - đó là một trong những thông số đó sysfs. Chỉ cần yêu cầu nó làm công việc nó đã làm.

Và đối với bàn phím của bạn, bạn chắc chắn nên làm như vậy - và đèn nền. Chỉ cần lấy thông tin bạn cần về các thiết bị này từ udevadm, viết một số quy tắc và udevadm testchúng.


Tại wiki.archlinux.org/index.php/, có một ví dụ tương tự ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power". Bạn có thể giải thích lý do tại sao quy tắc UDEV của bạn ở đây không bao gồm câu lệnh ACTION và không được phân tách bằng dấu phẩy không?
Sao lưu dự phòng

@ProBackup - có thể khiến tôi bị hỏng. Tôi không nghĩ rằng ACTIONbit là cần thiết mặc dù.
mikeerv

Để kiểm tra link_power_manloyment_policy chẳng hạn:udevadm test /devices/pci0000:00/0000:00:1f.2/ata1/host0/scsi_host/host0/
Sao lưu Pro

Đây thực sự là cách thích hợp để đi. Mọi người nên thực sự sử dụng các quy tắc udev trong trường hợp cần đồng bộ hóa với các sự kiện thêm / xóa thiết bị.
intelfx

2

[Ý tưởng ban đầu của tôi rằng điều này có thể là do systemd-tmpfiles sử dụng luồng I / O và không được sử dụng với Proc hoặc sys là sai . Giả thuyết thứ 2 của tôi, về tầm quan trọng của một dòng mới, cũng đã sai ...]

Tôi chỉ nhìn vào /usr/lib/systemd/system/systemd-tmpfiles-setup.servicevà có một vài bit trong đó có thể được quan tâm:

[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

'Muốn', 'Sau' và 'Trước' cung cấp một số thông tin về thời điểm xảy ra; Tôi sẽ nghĩ rằng thiết bị của bạn được đăng ký vào thời điểm này, nhưng có thể có một cái gì đó tiếp theo đặt lại giá trị sysfs.

Bit hữu ích nhất là dòng ExecStart, vì đó là lệnh thực sự chiếm tài khoản cho dịch vụ này. Điều này thực sự được đề cập trong man systemd-tmpfiles:

Ví dụ, trong khi khởi động, dòng lệnh sau được thực thi để đảm bảo rằng tất cả các thư mục tạm thời và dễ bay hơi được loại bỏ và tạo theo tệp cấu hình:

systemd-tmpfiles --remove - tạo

Vì vậy, để kiểm tra điều này, hãy đặt giá trị sysfs thành "đã bật" và sau đó thử chạy systemd-tmpfiles --create, nó sẽ xử lý lệnh 'w' của bạn trong /etc/tmpfiles.d. Nếu nó hoạt động (nó nên!), Thì bạn biết rằng phương thức systemd-tmpfile vẫn ổn, chỉ cần bạn phải thực hiện nó sau trong quá trình khởi động, có lẽ với:

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

Có nghĩa là viết tập tin dịch vụ của riêng bạn; nếu vì lý do nào đó nó không hoạt động, bạn luôn có thể viết tệp dịch vụ cho tập lệnh để thực hiện echo.


Tôi không nghĩ rằng systemd không thể viết trên các hệ thống tệp ảo. Sử dụng tmpfiles trên /proc/acpi/wakeuptác phẩm tốt, ví dụ ( wiki.archlinux.org/index.php/Systemd#Temporary_files )
Eang

@ital: Có lẽ tôi đã sai về điều đó, nhưng nếu bạn vẫn nản lòng hãy thử giả thuyết thứ hai của tôi ở trên.
goldilocks

Sử dụng echo -n disabled > /sys/...các tác phẩm, vì vậy có lẽ sự hiện diện của dòng mới không quan tâm trong trường hợp này. Nhưng tmpfiles vẫn không làm việc, tôi đã thử cả hai disabled\n"disabled\n"
Eang

Tôi đã chỉnh sửa bài đầu tiên với một bài kiểm tra khác và một số giả thuyết.
Eang

@ital Sheesh. Được rồi, khá chắc chắn rằng phỏng đoán thứ 3 của tôi là may mắn, vì vậy tôi đã chỉnh sửa nó ở trên một lần nữa, lol. Nếu sau đó bạn cần những điều cơ bản để viết và đăng ký dịch vụ systemd, hãy hỏi một câu hỏi mới và có thể tham khảo câu hỏi này; Tôi có thể giải thích nó mà không cần tất cả sự lộn xộn này, chúng tôi sẽ nhận được một số thông tin từ người khác và câu hỏi có thể đại diện cho hậu thế (tôi không thấy bất kỳ câu hỏi nào ở đây giải quyết vấn đề này rất tốt).
goldilocks

0

Gần đây tôi đã biết cách /etc/tmpfiles.d được xử lý trước khi / sys được tạo ra để bạn phải tạo quy tắc udev thích hợp để chúng được bật bất cứ khi nào thiết bị xuất hiện hoặc ... đi theo cách bẩn thỉu (nhưng nếu bạn hãy hỏi tôi, một cách linh hoạt hơn) và tạo một dịch vụ chạy tập lệnh với các lệnh để ghi vào / sys.

Hãy xem ở đây để biết ví dụ về cách tạo tập lệnh như vậy, https://bbs.archlinux.org/viewtopic.php?id=148170 mà bạn có thể điền vào một cái gì đó như:

#### #!/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

...

Bạn có thể đăng một liên kết xác nhận tuyên bố của bạn về tmpfiles & / sys / dân số không? Đây là một chủ đề Arch khác , nơi tmpfiles được đề xuất.
mlt

0

Điều này có thể hơi quá mức, nhưng trong trường hợp của tôi, cả hai phương pháp được đề cập trong các câu trả lời khác đều thất bại. Việc tmpfiles.d thực hiện các thay đổi trước khi các /sys/mục được điềnudevphương thức không tìm thấy mục (đó là một thiết bị mạng ảo br0). Như vậy, tôi đã tạo một tệp dịch vụ mới. Chỉ cần tạo một tệp mới /etc/systemd/system/disable-usb-wakeup.servicevà đặt bên trong sau:

[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

Bây giờ, để đảm bảo đơn vị này được khởi động trên mọi vấn đề chỉ cần khởi động:

# systemctl enable disable-usb-wakeup.service

Và bạn nên tốt để đi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.